Chapter overview

In this chapter, I focus on the second of my three key questions about the development of representations of mental life: How are the conceptual units that anchor representations of mental life organized in relation to each other, and how does this organization change over development? As in Chapter III, to address this question I draw on data from all of the current studies (Studies 1-4); for details about the methods of these studies, see Chapter II. The goal of this chapter is to provide “snapshots” of the organization of conceptual units in early childhood, middle childhood, and adulthood.

General analysis plan

High-level overview

My goal in this chapter is to examine the relationships among the “conceptual units” identified in Chapter III. How does a participant’s assessment of one conceptual unit for a particular target character (e.g., the degree to which he or she indicates that a beetle is capable of the physiological sensations of the BODY) affect that participant’s assessments of other conceptual units for that target character (e.g., his or her assessment of the beetle’s capacities in the domains of HEART or MIND)?

I focus in particular on the possibility that the mental capacity attributions documented by the studies included in this dissertation—re-analyzed as indicators of the broader “conceptual units” identified in Chapter III—might shed light on the hierarchical organization of these conceptual units, i.e., which conceptual units might be more basic or fundamental vs. more complex, and whether any of these conceptual units might or might not be considered to depend on the presence of others. In Chapter II, I illustrated this with the following example: If many participants endorse capacities associated with Conceptual Unit A without endorsing capacities associated with Conceptual Unit B, but very few participants do the reverse (endorsing capacities associated with Conceptual Unit B but not Conceptual Unit A), this provides some evidence that Conceptual Unit A is more basic or fundamental than Conceptual Unit B, or that Conceptual Unit B somehow depends on (perhaps requires) Conceptual Unit A.

Here I will translate this general interest in the relationships among conceptual units, as well as the specific intuition about how to detect the kinds of asymmetries that would be the signature of hierarchical relationships, into a specific analysis plan to be applied to each of these datasets in turn.

Details of analyses

Unlike the previous chapter, in which I employed a canonical approach to identifying latent constructs through analyses of correlation structures—exploratory factor analysis (EFA)—in this chapter there is no tried-and-true method for meeting my analysis goals. Instead, I chart my own course through these datasets, using the EFA solutions reported in Chapter II to score participants’ endorsements of each conceptual unit for the particular target character(s) that they assessed, examining holistic visualizations of the relationships among these endorsements, and then conducting more targeted regression analyses of difference scores between conceptual units as one index of asymmetrical (and possibly hierarchical) relationships between conceptual units.

Scoring endorsements of conceptual units

The first step in these analyses is to transform participants’ ratings of individual mental capacities into “scores” that indicate the extent to which they endorsed a particular conceptual unit for the target character(s) that they were assigned to assess. To do this, I make use of the EFAs presented in Chapter III—which originally served to identify a set of conceptual units in a particular sample—to a new end: the construction of “scales” for each of these conceptual units. Scale construction is a common use of EFA and similar dimensionality reduction analyses (if anything, more common than using EFA to make the kinds of theoretical arguments featured in Chapter II).

For each EFA solution, I construct a scale for each of the factors (conceptual units) identified by that solution. First, I sort each of the mental capacities included in that study into categories based on their loadings on each of the factors in that solution. For each mental capacity, I identify the “dominant” factor as the factor with the largest positive factor loading. For example, if the mental capacity feel happy had loadings of 0.60 on the BODY factor, 0.70 on the HEART factor, and 0.30 on the MIND factor, I would sort it into the HEART category. For each factor, I take the six highest-loading items as a candidate scale, then “drop” the capacities with the smallest factor loadings on their respective dominant factors until I have the same number of mental capacities in each category. For example, if the BODY factor were the dominant factor for nine mental capacities, the HEART factor for six capacities, and the MIND factor for five capacities, for each factor I would keep only the capacities with the five highest positive loadings on that factor, in order to construct three scales of equal length (and a maximum length of six items).

To calculate scores on these scales, I take the average of all of mental capacities for each scale, rescaling scores to range from 0 to 1 to facilitate comparison across studies. This yields a dataset in which each participant is associated with one score (between 0 and 1) for each of the conceptual units identified in the relative EFA solution, for each of the target characters that that participant assessed.

In this chapter, I apply this method to all of the three-factor solutions for adult samples as presented in Chapter III (Studies 1-4), yielding BODY, HEART, and MIND scores for each target character as assessed by each participant. (I ignore the aberrant four-factor solution for adults in Study 2 suggested by one of the three factor retention protocols considered in that chapter, since this was the only study out of the seven considered in which a four-factor solution appeared to add any value beyond the robust BODY-HEART-MIND framework common to all studies. [XX APPENDIX B?])

I use these three-factor adult solutions to assess datasets from both adults and children, allowing me to explore the relationships among a “mature” set of conceptual units (on the assumption that, over development, children will ultimately come to a consensus with the adults in their cultural context).

For the first sample of “older” children (7-9y of age, Study 2), I also briefly consider a second set of conceptual units: BODY, HEART, and MIND as defined by EFAs of the children’s own responses (rather than adults’ responses). Because the EFAs for older children and adults are so similar (see Chapter II and Table 4.10), the outcomes of these two approaches to constructing BODY, HEART, and MIND scales to yield very similar results in this age group. (Indeed, for the second sample of “older” children, Study 3, the scales that would emerge from EFA of their responses are identical to the scales that emerge from EFA of adult responses, with the exception of a single item on the BODY scale; see Table 4.10.)

For “younger” children (4-6y of age, Study 3; 4-5y of age, Study 4), I have chosen not to examine the various sets of two to four conceptual units that would be defined by EFAs of children’s own responses. As discusseed at length in Chapter II, EFAs of younger children’s responses were less robust and reliable than those of older children or adults, with different factor retention protocols generating different EFA solutions. For the purposes of the current chapter, this would mean assessing multiple additional sets of conceptual units for each of these samples. I have chosen to prioritize comparability across samples and studies over completeness in the main text of this chapter; the interested reader can find these alternative analyses in Appendix B [XX DO I WANT TO DO THIS?].

It is important to note that this is far from the only way to approach “scoring” participants on these conceptual units. For example, instead of constructing scales to capture each conceptual unit, I could have examined factor scores—summaries of each factor (conceptual unit) based on a participant’s responses to all mental capacities and the relationships between all mental capacities and all factors included in that EFA solution. However, much like z-scores, factor scores indicate where a participant falls in relation to other participants in the sample, and do not provide the kind of absolute score that is key to my goal in this chapter, which is to analyze relationships among factors in terms of the extent to which individual participants indicated that target characters “possessed” the conceptual units BODY, HEART, and MIND, and to compare these scores across samples and studies (rather than only across participants within a sample). [XX APPENDIX B?]

Even within the “scale” approach described in this section, there are many parameters of this analysis that I could have set differently. For example, I could have considered absolute factor loadings rather than raw factor loadings, which would allow for mental capacities that loaded especially strongly negatively on a particular factor to contribute (negatively) to scores on that conceptual unit; I could have omitted the step of making the scales for all factors within a single EFA solution equal length; I could have chosen to use only the top four or five (rather than six) mental capacities across all EFA solutions, or to set no limit on the number of items in a scale; or I could have implemented absolute thresholds for how strongly a mental capacity must load on a factor in order to count toward the score for that conceptual unit, or absolute limits on the degree to which a mental capacity can “cross-load” on non-dominant factors and still count toward the score for any one conceptual unit. [XX APPENDIX B?] However, these kinds of details differ quite dramatically across studies and age groups. For example, in some samples there are no strong negative factor loadings, and in others there are; if I considered absolute loadings rather than raw loadings, I could end up comparing scores from a “bipolar” scale in one sample to scores from a “unipolar” scale in another sample, making the comparison more difficult to interpret. Likewise, some EFA solutions tended to feature generally weaker factor loadings than others; if I were to impose absolute thresholds for the strength of factor loadings, I could end up comparing scores from scales of wildly different lengths across samples. In my view, the analysis decisions outlined above maximize comparability across studies and age groups—the primary goal of this chapter. (Note, however, that in the analysis code for this chapter I have included easy short cuts for the interested reader to explore different options for each of these parameters.)

Visualizing relationships

After constructing scales to capture participants’ endorsement of each conceptual unit, my next step is to characterize the relationships among scores on these three scales (BODY, HEART, and MIND). This is a truly exploratory endeavor: At the outset of this work, I had no strong hypotheses about these relationships, and only high-level intuitions about which aspects of these relationships would be of greatest interest in understanding the conceptual representations of interest. Accordingly, I begin each section with a holistic visualization of the relationships between the three pairs of conceptual units, presenting scatterplots of participants’ scores on each pair of scales (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND) and offering informal descriptions of what I consider to be the most striking features of these scatterplots. In addition to motivating my subsequent formal analyses, these informal descriptions are intended to guide future research targeting additional aspects of the relationships among conceptual units that are outside of the scope of the current dissertation.

Formal analyses of asymmetries

As I described in the theoretical overview of this dissertation (Chapter I [XX CHECK THIS IS TRUE]) and the opening of this chapter, one aspect of the relationships among conceptual units that is of particular interest to me is the possibility of asymmetries in these relationships. Were participants more likely to attribute BODY without HEART, or HEART without BODY? What about BODY vs. MIND, or HEART vs. MIND? Such asymmetries might reveal which conceptual units are more basic or fundamental, whether any of these conceptual units might be considered to depend on the presence of others—in other words, whether conceptual representations (in any particular sample) might be characterized by a hierarchical structure among conceptual units. Likewise, age-related differences in the direction or strength of these asymmetries might hint at developmental changes in these hierarchical structures over early and middle childhood.

Guided by this theoretical interest, the last step in my analyses in this chapter is to examine differences between scores on the BODY, HEART, and MIND scales. For each pair of conceptual units (e.g., BODY vs. HEART), I calculate a simple difference between scores on these two scales (in this case, subtracting participants’ HEART scores from their BODY scores). In the visualizations described in the previous section, this corresponds to the perpendicular distance between a particular datapoint and the line of equivalence (\(y = x\)). (The directions of these difference scores were chosen arbitrarily; e.g., I could have chosen to subtract participants’ BODY scores from their HEART scores.)

Here I describe my principles for interpreting these difference scores. A summary of these difference scores across all samples and studies can be found at the end of this chapter (Figure 4.10, panel A).

In my view, difference scores close to zero provide no evidence for or against a hierarchical relationship between conceptual units. This is illustrated most dramatically by the fact that a difference score of zero could occur if a participant attributes very little in the way of mental life to a particular target character (e.g., an inert object) or if a participant attributes maximal mental life to a particular target character (e.g., an adult human)—in either case, this would yield difference scores of zero for any pair of conceptual units. Even if a participant endorses two conceptual units to a middling degree (e.g., indicating that a beetle has middling capacities in both the BODY and MIND domains), I would not consider this evidence against a possible hierarchical relationship between the conceptual units in question.

Meanwhile, if participants within a sample have radically divergent difference scores—e.g., if roughly half of participants have much higher HEART than MIND scores and roughly half have much lower HEART than MIND scores—I interpret this as some evidence against systematic hierarchical relationships between the conceptual units in question.

It is only an abundance of non-zero difference scores running in the same direction for many participants within a sample that, in my view, provides evidence for systematic hierarchies among the conceptual units. This degree of consensus across participants in the direction of asymmetry between endorsements of two conceptual units is particularly significant in these datasets because these studies were designed with the express purpose of eliciting variability in mental capacity attributions across participants—either by asking participants about “edge cases” (a beetle, a robot), whose particular mental capacity profiles are likely to be the subject of disagreement across individuals; or by asking different participants to consider a variety of “diverse characters” (including inert objects, technologies, and a wide range of animals and humans), whose mental capacity profiles are likely considered to vary dramatically. (See Chapter II for further discussion of these two variants of the experimental approach.) Differences in individual participants’ knowledge, experience, and opinions, and differences in the target characters assessed by different participants, were key features of the design of these studies; it was critical to the success of the EFAs presented in Chapter III that participants varied in the degree to which they endorsed particular mental capacities. If, despite this variability, participants nonetheless converge on a same pattern of relative endorsements across two conceptual units—e.g., if most participants endorse capacities included in the MIND scale more strongly than they endorse capacities included in the HEART scale, regardless of the absolute strength of these endorsements—this provides some evidence of a common conceptual framework that places these conceptual units in asymmetrical, perhaps hierarchical, relation to one another.

To operationalize these principles and test for consensus in the direction of difference scores between any two conceptual units, I compare difference scores to zero via Bayesian regressions, using the “brms” package for R [XX CITE]. I conduct a separate regression analysis for each pair of conceptual units, accounting for differences between target characters (effect-coded so as to center the intercept at the grand mean) and accounting for within-subjects designs when appropriate (i.e., for Study 1c and Study 4) by including maximal random effects structures (random intercepts for participants). In these analyses, I am primarily interested in whether the intercept is estimated to be differentiable from zero, which I gauge by assessing whether the 95% credible interval for the intercept contains zero.

I conduct many such regressions in this chapter: One for each of the three pairs of conceptual units (BODY - HEART, BODY - MIND, and HEART - MIND), for each age group, for each sample. A summary of these intercepts across all samples and studies can be found at the end of this chapter (Figure 4.10, panel B). In addition, for studies that include a developmental comparison (Studies 2-4), I conduct an additional analysis for each of the three pairs of conceptual units, including main effects and interactions to compare the age groups included (dummy-coded with adults as the baseline); these analyses provide formal assessments of the degree to which children differ from adults in the asymmetry of their responses to these conceptual units. I do not implement any “corrections” for multiple comparisons, in part because my evaluations of these analyses are based on credibla intervals rather than p-values or other frequentist indices of statistical significance. Parameter estimates (b) can be used as indices of effect size.

Study 1: An adult endpoint

In the context of this dissertation, Study 1 serves to describe a developmental endpoint for conceptual representations of mental life. In this chapter, I focus on what this study can reveal about the relationships among the conceptual units discussed in Chapter III. These analyses were not included in the original publication of this work (Weisman et al., 2017).

Studies 1a-1c employed the “edge case” variant of the general approach, with participants assessing the mental capacities of a beetle, a robot, or both. Studies 1a and 1b were identical: US adults (Study 1a: n=405; Study 1b: n=406) each assessed a single target character on 40 mental capacities. Study 1c employed very similar methods, with the exception that participants (n=200) each assessed both target characters side by side (with left-right position counterbalanced across participants). Because these studies were so similar, in this chapter, I will discuss them in tandem.

Study 1d employed the “diverse characters” variant of the general approach, in which 431 US adults were randomly assigned to assess the same set of 40 mental capacities used in Studies 1a-1d for one of the following 21 target characters: an adult, a child, an infant, a person in a persistent vegetative state, a fetus, a chimpanzee, an elephant, a dolphin, a bear, a dog, a goat, a mouse, a frog, a blue jay, a fish, a beetle, a microbe, a robot, a computer, a car, or a stapler. (See Chapter II and Weisman et al., 2017, for detailed methods.)

Results

Studies 1a-1c

Scale construction

For each of these three studies, following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each, with a large degree of overlap in items across studies; see Table 4.1.

Table 4.1: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 1a-1d (see Chapter III). A checkmark indicates that a mental capacity was included in a scale for a particular study.
Capacity Study 1a Study 1b Study 1c Study 1d
BODY scale
getting hungry
experiencing pain
feeling tired
experiencing fear
experiencing pleasure
having free will
being conscious
having desires
feeling calm
HEART scale
feeling embarrassed
experiencing pride
feeling love
experiencing guilt
holding beliefs
feeling disrespected
feeling depressed
telling right from wrong
MIND scale
remembering things
recognizing someone
sensing temperatures
communicating with others
seeing things
perceiving depth
detecting sounds
working toward a goal
making choices

Visualization

The visualizations of relationships among scores on these BODY, HEART, and MIND scales are remarkably similar across Studies 1a-1c (see Figure 4.1, rows A-C).

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.1, leftmost column: panels A1, B1, and C1). To my eyes, the most striking features of these visualizations are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the upper left quadrant of these plots. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, that many participants attributed more BODY than HEART to the target character in question, but virtually no participants attribute more HEART than BODY. This asymmetry appears to have been driven primarily by participants’ assessments of the beetle (in red); for the robot (in blue), BODY and HEART scores appear to have been more similar (close to the dotted line), and were generally quite low.

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.1, center column: panels A2, B2, and C2). Similar to the BODY vs. HEART comparison, two notable features of these visualizations are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in the lower right quadrant of these plots. Most participants tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, while relatively few participants endorsed MIND items less strongly than BODY items. However, visual inspection suggests that this asymmetry was less extreme than the asymmetry between BODY and HEART scores just described. In this case, the asymmetry between BODY and MIND appears to have been driven primarily by participants’ assessments of the robot (in blue); for the beetle (in red), BODY and MIND scores appear to have been more similar (close to the dotted line).

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.1, rightmost column: panels A3, B3, and C3). Again, two features of these visualizations are particularly striking: (1) There is a positive relationship between scores on the MIND and HEART scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line). The asymmetry between MIND and HEART scores appears to have been particularly extreme: Almost all participants endorsed the mental capacity items included in the MIND scale more strongly than the items included in the HEART scale. In this case, this asymmetry appears to be born out for both target characters, but perhaps more exaggerated for the beetle (in red) than the robot (in blue).

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (a beetle vs a robot), and including maximal random effects structures (in this case, no random effects for Studies 1a and 1b, and random intercepts for participants in Study 1c). See Figure 4.2, panels A-C for visual depictions of these difference scores.

BODY vs. HEART

Across Studies 1a-1c, difference scores comparing the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.2). As I speculated in the previous section, in all studies this difference was driven by participants’ assessments of the beetle; in the aggregate, difference scores were reduced to 0 for the robot (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.2).

BODY vs. MIND

Across Studies 1a-1c, difference scores comparing the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.2). In all studies this difference was driven by participants’ assessments of the robot; in the aggregate, difference scores were reduced to 0 for the beetle (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.2).

HEART vs. MIND

Across Studies 1a-1c, difference scores comparing the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.2). In all studies this difference was somewhat exaggerated in assessments of the robot, relative to the beetle (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.2).

Table 4.2: Regression analyses of difference scores for US adults in Studies 1a-1c. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). Intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Study 1a
Study 1b
Study 1c
Parameter b 95% CI b 95% CI b 95% CI
BODY - HEART
Intercept 0.22 [ 0.20, 0.24] * 0.24 [ 0.22, 0.25] * 0.24 [ 0.22, 0.26] *
Robot vs. GM -0.22 [-0.24, -0.20] * -0.22 [-0.24, -0.21] * -0.24 [-0.25, -0.22] *
BODY - MIND
Intercept -0.28 [-0.30, -0.26] * -0.27 [-0.29, -0.25] * -0.27 [-0.29, -0.25] *
Robot vs. GM -0.31 [-0.33, -0.28] * -0.28 [-0.30, -0.25] * -0.32 [-0.34, -0.29] *
HEART - MIND
Intercept -0.50 [-0.52, -0.47] * -0.51 [-0.54, -0.48] * -0.51 [-0.54, -0.49] *
Robot vs. GM -0.09 [-0.11, -0.06] * -0.05 [-0.08, -0.03] * -0.08 [-0.10, -0.06] *

Interim discussion

Across Studies 1a-1c, visual inspection of the relationships among the conceptual units identified in Chapter III (BODY, HEART, and MIND) suggested that all of these relationships are characterized by two features: (1) Positive contingencies, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) Robust asymmetries, such that participants tended to endorse MIND more strongly than BODY or HEART, and HEART more strongly than MIND. These asymmetries were most pronounced for comparisons involving HEART, with the vast majority of participants in all three of these studies endorsing both BODY and MIND more strongly than HEART for both of the “edge case” characters included in these studies (a beetle and a robot).

Formal analyses of difference scores across the BODY, HEART, and MIND scales in Studies 1a-1c confirmed these informal observations.

Study 1d

Scale construction

Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each, with a large degree of overlap in items between these scales and the scales derived from Studies 1a-1c; see Table 4.1.

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.1, row D.

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.1, panel D1). Much as in Studies 1a-1c (rows A-C), the most striking features of this visualization are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the upper left quadrant. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more BODY than HEART to the target character in question, but virtually no participants attributed more HEART than BODY.

Visual inspection of mean scores by target character further reveals that, in the aggregate, characters that received relatively low BODY scores (e.g., inert objects, technologies, the fetus, the person in a persistent vegetative state, and such “lower” lifeforms as a microbe) received universally low mean HEART scores, while characters that received relatively high BODY scores (e.g., “higher” lifeforms like animals and typical humans) varied in their mean HEART scores. This raises the intriguing possibility that attributions of BODY and HEART may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of BODY.

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.1, panel D2). As in Studies 1a-1c, two notable features of this visualization are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are datapoints in the upper left but not the lower right quadrants. However, while participants who assessed certain target characters (namely, the technologies) tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, participants who assessed other target characters, if anything, appear to have shown the reverse pattern, endorsing MIND items slightly less strongly than BODY items. In other words, there appears to be a less consistency in the “asymmetry” between BODY and MIND in Study 1d than there was in Studies 1a-1c.

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.1, panel D1). Much as in Studies 1a-1c (rows A-C), the most striking features of this visualization are that (1) there is a positive relationship between scores on the HEART and MIND scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the lower right quadrant. Individual participants tended to endorse the mental capacity items included in the MIND scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more MIND than HEART to the target character in question, but virtually no participants attributed more HEART than MIND.

Visual inspection of mean scores by target character further reveals that, in the aggregate, characters that received relatively low MIND scores (e.g., inert objects, the fetus, and such “lower” lifeforms as a microbe) received universally low mean HEART scores, while characters that received relatively high MIND scores (e.g., more sophisticated technologies as well as “higher” lifeforms like animals and typical humans) varied in their mean HEART scores. As in the BODY vs. HEART comparison discussed earlier, this raises the intriguing possibility that attributions of HEART and MIND may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of MIND.

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in Studies 1a-1c, for each pair of conceptual units, I conduct a Bayesian regression to compare difference scores to zero, controlling for differences in assessments of the 21 “diverse characters” that were featured as target characters in these studies. See Figure 4.2, panel D, for visual depictions of these difference scores.

BODY vs. HEART

These regression analyses confirmed that in Study 1d, as in Studies 1a-1c, difference scores comparing the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.3).

This asymmetry was more pronounced for some characters, and less pronounced for others—namely, humans (who generally received high scores on both the BODY and HEART scales) and technologies (who generally received low scores on both the BODY and HEART scales). A full discussion of the differences between target characters is beyond the scope of this chapter, but it is worth noting that there were no characters for whom this asymmetry was systematically reversed (i.e., who were generally considered to have more HEART than BODY capacities). See Figure 4.2, panel D, and the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.3.

BODY vs. MIND

These regression analyses indicated that in Study 1d, in contrast to Studies 1a-1c, difference scores comparing the BODY and MIND scales were only very slightly non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.3).

Again, this asymmetry was more pronounced for some characters—namely, technologies (who generally received high scores on the MIND scale and low scores on the BDOY scale)—and less pronounced for others. Indeed, there were some characters (e.g., the child, the infant, the fetus, and a handful of non-human animals) for whom this asymmetry tended to run in the opposite direction, with participants attributing more BODY than MIND capacities. See Figure 4.2, panel D, and the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.3.

HEART vs. MIND

These regression analyses confirmed that in Study 1d, as in Studies 1a-1c, difference scores comparing the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.3).

Similar to the BODY vs. HEART comparison, this asymmetry was less pronounced for humans (who generally received high scores on both the HEART and MIND scales), and more pronounced for other characters. A full discussion of the differences between target characters is beyond the scope of this chapter, but it is worth noting that there were no characters for whom this asymmetry was systematically reversed (i.e., who were generally considered to have more HEART than MIND capacities). See Figure 4.2, panel D, and the various comparisons of target characters to the grand mean for the “HEART-MIND” comparison in Table 4.3.

Interim discussion

In Study 1d, many of the results obtained in Studies 1a-1c were upheld. In particular, (1) The relationships between BODY vs. HEART and between MIND vs. HEART appear to be positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the other; and (2) There appear to be robust asymmetries in these positive relationships, such that participants tended to endorse both BODY or MIND more strongly than HEART.

However, visual inspection of the BODY vs. MIND scatterplot for Study 1d suggests that this relationship was quite variable across participants and across target characters. This stands in contrast to the more systematic asymmetry that emerged in Studies 1a-1c, in which participants tended to endorse MIND more strongly than BODY (particularly to the robot).

These formal analyses of difference scores across the BODY, HEART, and MIND scales in Study 1d confirmed these informal observations: Participants tended to endorse both BODY and MIND more strongly than HEART. In the aggregate, there was a slight tendency for participants to endorse MIND more strongly than BODY, but this asymmetry was weak and highly contingent on the particular target character that participants were assigned to assess.

Table 4.3: Regression analyses of difference scores for US adults in Study 1d. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between each character and the grand mean (GM). Intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Study 1d
Parameter b 95% CI
BODY - HEART
Intercept 0.35 [ 0.33, 0.37] *
Adult vs. GM -0.33 [-0.42, -0.24] *
Child vs. GM -0.12 [-0.21, -0.04] *
Infant vs. GM 0.37 [ 0.28, 0.46] *
PVS vs. GM -0.25 [-0.34, -0.17] *
Fetus vs. GM -0.04 [-0.13, 0.04]
Chimpanzee vs. GM 0.10 [ 0.02, 0.19] *
Elephant vs. GM 0.11 [ 0.03, 0.20] *
Dolphin vs. GM 0.14 [ 0.05, 0.22] *
Bear vs. GM 0.22 [ 0.13, 0.31] *
Dog vs. GM 0.07 [-0.01, 0.15]
Goat vs. GM 0.23 [ 0.15, 0.32] *
Mouse vs. GM 0.28 [ 0.19, 0.38] *
Frog vs. GM 0.31 [ 0.22, 0.39] *
Blue jay vs. GM 0.30 [ 0.21, 0.39] *
Fish vs. GM 0.20 [ 0.11, 0.29] *
Beetle vs. GM 0.05 [-0.04, 0.14]
Microbe vs. GM -0.21 [-0.30, -0.12] *
Robot vs. GM -0.39 [-0.47, -0.30] *
Computer vs. GM -0.36 [-0.44, -0.27] *
Car vs. GM -0.35 [-0.43, -0.26] *
BODY - MIND
Intercept -0.02 [-0.04, -0.01] *
Adult vs. GM 0.05 [-0.02, 0.11]
Child vs. GM 0.13 [ 0.06, 0.20] *
Infant vs. GM 0.26 [ 0.19, 0.33] *
PVS vs. GM 0.05 [-0.02, 0.12]
Fetus vs. GM 0.11 [ 0.04, 0.18] *
Chimpanzee vs. GM 0.11 [ 0.04, 0.18] *
Elephant vs. GM 0.03 [-0.03, 0.10]
Dolphin vs. GM 0.03 [-0.04, 0.10]
Bear vs. GM 0.07 [ 0.00, 0.14] *
Dog vs. GM 0.12 [ 0.06, 0.18] *
Goat vs. GM 0.12 [ 0.05, 0.19] *
Mouse vs. GM 0.07 [-0.01, 0.14]
Frog vs. GM 0.07 [ 0.00, 0.13]
Blue jay vs. GM 0.04 [-0.03, 0.10]
Fish vs. GM 0.03 [-0.04, 0.10]
Beetle vs. GM 0.00 [-0.07, 0.07]
Microbe vs. GM -0.08 [-0.15, -0.01] *
Robot vs. GM -0.65 [-0.72, -0.58] *
Computer vs. GM -0.40 [-0.47, -0.34] *
Car vs. GM -0.18 [-0.24, -0.12] *
HEART - MIND
Intercept -0.38 [-0.40, -0.35] *
Adult vs. GM 0.38 [ 0.28, 0.47] *
Child vs. GM 0.25 [ 0.15, 0.35] *
Infant vs. GM -0.12 [-0.21, -0.02] *
PVS vs. GM 0.30 [ 0.21, 0.39] *
Fetus vs. GM 0.15 [ 0.06, 0.26] *
Chimpanzee vs. GM 0.01 [-0.09, 0.10]
Elephant vs. GM -0.08 [-0.17, 0.02]
Dolphin vs. GM -0.11 [-0.20, -0.02] *
Bear vs. GM -0.15 [-0.24, -0.05] *
Dog vs. GM 0.05 [-0.04, 0.13]
Goat vs. GM -0.11 [-0.20, -0.02] *
Mouse vs. GM -0.21 [-0.32, -0.11] *
Frog vs. GM -0.24 [-0.34, -0.14] *
Blue jay vs. GM -0.27 [-0.36, -0.18] *
Fish vs. GM -0.17 [-0.27, -0.08] *
Beetle vs. GM -0.05 [-0.14, 0.05]
Microbe vs. GM 0.13 [ 0.03, 0.22] *
Robot vs. GM -0.27 [-0.36, -0.18] *
Computer vs. GM -0.05 [-0.14, 0.05]
Car vs. GM 0.17 [ 0.08, 0.26] *

Discussion

XX INSERT STUDY 1 DISCUSSION

Studies 1a-1d converge to suggest that the relationships among BODY, HEART, and MIND, are characterized by being (1) positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the other; and (2) asymmetrical, such that certain conceptual units are systematically endorsed more strongly than others. In particular, the vast majority of participants across all four of these studies endorsed both BODY and MIND at least as strongly, and often more strongly, than they endorsed HEART, regardless of which target character they were assessing or how strong their endorsements were in absolute terms. Taken together, I consider this to be fairly strong evidence that the conceptual units that I have called BODY and MIND are more basic or fundamental than the unit that I refer to as HEART.

The relationship between these two more “basic” conceptual units—BODY and MIND—appears to be more complicated. Across Studies 1a-1d, in the aggregate participants tended to endorse MIND (slightly) more strongly than BODY. However, in each study this asymmetry was driven by assessments of a particular kind of target character: technologies (the robot in Studies 1a-1c; the robot, computer, and car in Study 1d). For other target characters (including the beetle in Studies 1a-1c, as well as many of the target characters in Study 1d), average difference scores hovered around zero, with some participants endorsing BODY more strongly than MIND, others endorsing MIND more strongly than BODY, and still others endorsing BODY and MIND to roughly equal degrees. In Study 1d there were even a few target characters—namely, immature humans and a handful of non-human animals—for whom difference scores systematically ran in the opposite direction to what was observed among technologies, with participants endorsing BODY more strongly than MIND. Taken together, these observations suggest that asymmetries in attributions of BODY vs. MIND are more variable across individual participants and more sensitive to differences in target characters—and, by extension, that there is no general or robust hierarchical relationship between these two conceptual units.

Study 2: Conceptual change between middle childhood (7-9y) and adulthood

In the context of this dissertation, Study 2 serves to provide an initial investigation of the earlier orgins of conceptual representations of mental life, focusing on middle childhood (7-9y). In this chapter, I focus on what this study can reveal about changes in the relationships among the conceptual units BODY, HEART, and MIND between middle childhood (7-9y) and adulthood.

In Study 2, 200 US adults and 200 US children between the ages of 7.01-9.99 years (median: 8.31y) each assessed a single target character on 40 mental capacities. To make the study appropriate for children in this age range, the wording of some the 40 mental capacities employed in Study 1 was modified to use more age-appropriate vocabulary, and participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants randomly assigned to assess either a beetle or a robot. (See Chapter II for detailed methods.)

Results

Adults

Scale construction

Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.10.

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.3, row A.

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.3, panel A1). Much as in Study 1, the most striking features of this visualization are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are very few datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the upper left quadrant. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more BODY than HEART to the target character in question, but virtually no participants attributed more HEART than BODY. As in Studies 1a-1c (which also featured these two “edge cases” as target characters), this asymmetry appears to have been driven primarily by assessments of the beetle (in red), rather than the robot (in blue).

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.3, panel A2). As in Study 1, two notable features of this visualization are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in the lower right quadrant. Most participants tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, while relatively few participants endorsed MIND items less strongly than BODY items (though this asymmetry appears to have been less extreme than the asymmetry between BODY and HEART scores documented in the previous paragraph). As in the BODY vs. MIND comparison for Studies 1a-1c (which also featured these two “edge cases” as target characters), the asymmetry between BODY and MIND appears to have been driven primarily by participants’ assessments of the robot (in blue), rather than the beetle (in red).

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.3, panel A1). As in Study 1, the most striking features of this visualization are that (1) there is a positive relationship between scores on the HEART and MIND scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the lower right quadrant. Individual participants tended to endorse the mental capacity items included in the MIND scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more MIND than HEART to the target character in question, but virtually no participants attributed more HEART than MIND. As in the HEART vs. MIND comparison for Studies 1a-1c (which also featured these two “edge cases” as target characters), this asymmetry appears to have been particularly extreme: Almost all participants endorsed the mental capacity items included in the MIND scale more strongly than the items included in the HEART scale. Again, this asymmetry appears to be born out for both target characters, but perhaps more exaggerated for the beetle (in red) than the robot (in blue).

Interim discussion

My informal observations of the relationships among adults’ endorsements of the conceptual units in Study 2 are very similar to those for adults in Study 1: (1) All of these inter-unit relationships were positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) There were robust asymmetries in these positive relationships, such that participants tended to endorse MIND more strongly than BODY or HEART, and HEART more strongly than MIND. As in Studies 1a-1c, visual inspection suggests that these asymmetries were most pronounced for comparisons involving HEART, with virtually every participant across all three of these studies endorsing both BODY and MIND more strongly than HEART for both of the “edge case” characters included in these studies (a beetle and a robot).

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in Studies 1a-1c, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies. See Figure 4.5, panel D, for visual depictions of these difference scores.

BODY vs. HEART

As in Study 1, among adults in Study 2, difference scores comparing the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.4). As I speculated earlier, this difference was driven by participants’ assessments of the beetle; in the aggregate, difference scores were reduced to 0 for the robot (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.4).

BODY vs. MIND

As in Studies 1a-1c (which featured the same “edge cases” as target characters), among adults in Study 2, difference scores comparing the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.4). This difference was driven by participants’ assessments of the robot; in the aggregate, difference scores were reduced to 0 for the beetle (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.4).

HEART vs. MIND

As in Study 1, among adults in Study 2, difference scores comparing the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.4). As in Studies 1a-1c, this difference was somewhat exaggerated in assessments of the robot, relative to the beetle (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.4).

Interim discussion

These formal analyses of difference scores across the BODY, HEART, and MIND scales among adults in Study 2 confirm my informal observations of asymmetries described in the previous section, and align quite closely with analyses of adults in Studies 1a-1c: Across all of these studies, participants tended to endorse MIND more strongly than BODY or HEART, and BODY more strongly than HEART.

Children (7-9y)

XX INSERT SECTION INTRODUCTION/TRANSITION

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.3, row B.

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.3, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it—but both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more BODY than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than BODY. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more BODY than HEART to the beetle (in red) but, if anything, more HEART than BODY to the robot (in blue).

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.3, panel B2). As among adults in this study (panel A2), the relationship between scores on the BODY and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous section, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than BODY to the target character in question (like the vast majority of adults), quite a few children attributed more BODY than MIND. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more MIND than BODY to the robot (in blue) but, if anything, more BODY than MIND to the beetle (in red).

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.3, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous sections, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. This appears to have been true for both target characters.

Interim discussion

My informal observations of the relationships among children’s endorsements of the conceptual units in Study 2 are generally similar to those of adults in this study, but dramatically attenuated: (1) All of these inter-unit relationships were somewhat positive, but only somewhat; and (2) There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons).

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in previous analyses, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (beetle and robot). See Figure 4.5, panel B, for visual depictions of these difference scores.

BODY vs. HEART

In contrast to analyses of adults, among children in Study 2 difference scores comparing the BODY and HEART scales were not differentiable from zero (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.4), and the direction of difference varied substantially across target characters (see the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.4).

BODY vs. MIND

As among adults, among children in Study 2 difference scores comparing the BODY and MIND scales were substantially, in the direction of children endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.4), and this difference was exaggerated in assessments of the robot (see the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.4).

HEART vs. MIND

As among adults, among adults in Study 2 difference scores comparing the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.4), and this difference was exaggerated in assessments of the robot(see the various comparisons of target characters to the grand mean for the “HEART-MIND” comparison in Table 4.4).

Interim discussion

These formal analyses of difference scores across the BODY, HEART, and MIND scales among children in Study 2 confirm my informal observations that children generally showed similar patterns of asymmetries to adults—with the notable exception of the BODY vs. HEART comparison, in which children’s responses revealed no consistent asymmetry. In other words, children, like adults, tended to endorse MIND more strongly than BODY or HEART, but did not show a robust adult-like tendency to endorse BODY more strongly than HEART.

Developmental comparison

In the previous sections, I analyzed adults’ and children’s responses separately. Here I conduct a formal comparison of difference scores between conceptual units among these two age groups, to assess the size and robustness of these ostensive developmental differences.

BODY vs. HEART

Difference scores between the BODY and HEART scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-HEART” comparison in Table 4.5). The difference between target characters did not differ substantially across age groups (see the “Interaction” row for the “BODY-HEART” comparison in Table 4.5).

BODY vs. MIND

Difference scores between the BODY and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-MIND” comparison in Table 4.5), and the difference between target characters was attenuated among children (see the “Interaction” row for the “BODY-MIND” comparison in Table 4.5).

HEART vs. MIND

Difference scores between the HEART and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “HEART-MIND” comparison in Table 4.5), The difference between target characters did not differ substantially across age groups (see the “Interaction” row for the “HEART-MIND” comparison in Table 4.5).

Interim discussion

These formal comparisons of difference scores among children vs. adults in Study 2 confirm my earlier observations that asymmetries were substantially attenuated (and in some cases, reduced to zero) among children, relative to the baseline set by adults. In addition, among children the differences in these asymmetries between the two “edge cases” included in this study (the beetle vs. the robot) were also attenuated, relative to adults; this is in line with my earlier, informal observations that these asymmetries sometimes appeared to reverse in direction across the two target characters.

Children (7-9y), using children’s own scales

XX INSERT TRANSITION

Scale construction

Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.10.

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.4.

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.4, panel A1). The relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it—but both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more BODY than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than BODY. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more BODY than HEART to the beetle (in red) but, if anything, more HEART than BODY to the robot (in blue).

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.4, panel A2). Tthe relationship between scores on the BODY and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous section, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than BODY to the target character in question (like the vast majority of adults), quite a few children attributed more BODY than MIND. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more MIND than BODY to the robot (in blue) but, if anything, more BODY than MIND to the beetle (in red).

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.4, panel A3). The relationship between scores on the HEART and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous sections, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. This appears to have been true for both target characters.

Interim discussion

My informal observations of the relationships among children’s endorsements of the conceptual units in Study 2—as indexed by their own scales—are generally similar to those of adults in this study, but dramatically attenuated: (1) All of these inter-unit relationships were somewhat positive, but only somewhat; and (2) There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons).

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in previous analyses, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (beetle and robot). See Figure 4.5, panel C, for visual depictions of these difference scores.

BODY vs. HEART

As in analyses using adults’ scales, using children’s own BODY and HEART scales to analyze their data revealed that difference scores between these conceptual units were not differentiable from zero (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.5), and the direction of difference varied substantially across target characters (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.5).

BODY vs. MIND

As in analyses using adults’ scales, using children’s own BODY and MIND scales to analyze their data revealed that difference scores between these conceptual units substantially non-zero, in the direction of children endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.5), and this difference was exaggerated in assessments of the robot (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.5).

HEART vs. MIND

As in analyses using adults’ scales, using children’s own HEART and MIND scales to analyze their data revealed that difference scores between these conceptual units substantially non-zero, in the direction of children endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.5), and this difference was exaggerated in assessments of the robot (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.5).

Interim discussion

Using children’s own BODY, HEART, and MIND scales to assess asymmetries in their endorsements of these conceptual units revealed the same pattern of results obtained when using adults’ scales: Children generally showed similar patterns of asymmetries to adults, with the notable exception of the BODY vs. HEART comparison, in which children’s responses revealed no consistent asymmetry. In other words, children, like adults, tended to endorse MIND more strongly than BODY or HEART, but did not show a robust adult-like tendency to endorse BODY more strongly than HEART—regardless of whether these conceptual units were indexed by scales designed to capture adults’ or children’s construals of BODY, HEART, and MIND.

Discussion

XX INSERT STUDY 2 DISCUSSION

Table 4.4: Regression analyses of difference scores among US adults and children (7-9y of age) in Study 2. XX ADD INFO RE CHILDREN. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Adults
Children, 7-9y (using adults' scales)
Children, 7-9y (using their own scales)
Parameter b 95% CI b 95% CI b 95% CI
BODY - HEART
Intercept 0.29 [ 0.26, 0.33] * 0.04 [ 0.00, 0.09] -0.03 [-0.08, 0.01]
Robot vs. GM -0.25 [-0.28, -0.22] * -0.20 [-0.24, -0.16] * -0.21 [-0.25, -0.16] *
BODY - MIND
Intercept -0.34 [-0.38, -0.31] * -0.16 [-0.20, -0.13] * -0.17 [-0.21, -0.13] *
Robot vs. GM -0.37 [-0.41, -0.34] * -0.29 [-0.32, -0.25] * -0.30 [-0.34, -0.26] *
HEART - MIND
Intercept -0.64 [-0.68, -0.60] * -0.21 [-0.26, -0.16] * -0.14 [-0.19, -0.08] *
Robot vs. GM -0.13 [-0.16, -0.09] * -0.08 [-0.13, -0.03] * -0.09 [-0.15, -0.04] *
Table 4.5: Regression analyses of differences in difference scores between US adults and children (7-9y of age) difference scores in Study 2. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) a difference between target characters (among adults), reported here as a difference between the robot and the grand mean (GM); (3) the overall difference between children and adults (collapsing across target characters); and (4) the interaction between this age difference and the difference between target characters. The developmental comparisons are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Developmental comparison
Parameter b 95% CI
BODY - HEART
Intercept 0.29 [ 0.26, 0.33] *
Children vs. adults -0.25 [-0.30, -0.20] *
Robot vs. GM -0.25 [-0.29, -0.21] *
Interaction 0.05 [-0.01, 0.10]
BODY - MIND
Intercept -0.34 [-0.37, -0.31] *
Children vs. adults 0.18 [ 0.13, 0.23] *
Robot vs. GM -0.37 [-0.41, -0.34] *
Interaction 0.09 [ 0.04, 0.13] *
HEART - MIND
Intercept -0.64 [-0.68, -0.59] *
Children vs. adults 0.43 [ 0.37, 0.49] *
Robot vs. GM -0.13 [-0.17, -0.08] *
Interaction 0.04 [-0.02, 0.10]

Study 3: Conceptual change over early and middle childhood (4-9y)

In the context of this dissertation, Study 3 serves to provide a conceptual replication of the investigation of middle childhood (7-9y) initiated in Study 2, as well as an extension of this exploration of developmental change into earlier childhood (4-6y). In this chapter, I again focus on what this study can reveal about changes in the relationships among the conceptual units BODY, HEART, and MIND over the course of early and middle childhood (7-9y), compared to adulthood. As a reminder, in this chapter I analyze children’s responses with respect to the “mature” conceptual units BODY, HEART, and MIND, as defined by EFA of adults’ responses (see [XX APPENDIX B?] for further analyses with respect to the conceptual units identified through EFA of children’s own mental capacity attributions, as presented in Chapter III).

In Study 3, 116 US adults, 125 “older” children (7.08-9.98 years; median: 8.56y), and 124 “younger” children (4-6.98 years; median: 5.03y) each assessed a single target character on 20 mental capacities. To make the study appropriate for children in this age range, participants assessed a subset of the 40 mental capacities employed in Study 2, chosen to represent the three “conceptual units” revealed by Studies 1-2 (BODY, HEART, and MIND) and to cover a similar range of mental capacities as Studies 1-2. As in Study 2, participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “diverse characters” variant of the general approach, with participants randomly or pseudo-randomly assigned to assess either one of the following 9 characters: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer. (See Chapter II for detailed methods.)

Results

Adults

Scale construction

Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.10.

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.6, row A.

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.6, panel A1). Echoing the visualizations of adults’ responses in Studies 1 and 2, two striking features of this visualization are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the upper left quadrant. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more BODY than HEART to the target character in question, but virtually no participants attributed more HEART than BODY.

Visual inspection of mean scores by target character further reveals a suite of characters—namely, inanimate objects—that, in the aggregate, received very low BODY scores and very low HEART scores. This suite of characters appears to be distinct from the other characters—all animate beings—all of which, in the aggregate, received relatively high BODY scores, but varied in their mean HEART scores. Echoing Study 1d, this raises the intriguing possibility that adults’ attributions of BODY and HEART may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of BODY. (This will not be explored further in the current dissertation.)

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.6, panel A2). As in visualizations of adults’ responses in Studies 1 and 2, two notable features of this visualization are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in the lower right quadrant. Echoing Study 1d, however, while participants who assessed certain target characters (namely, the two technologies: a robot and a computer) tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and often more strongly, than they endorsed items included in the BODY scale, participants who assessed other target characters, if anything, appear to have shown the reverse pattern, endorsing MIND items slightly less strongly than BODY items. In other words, in this “diverse characters” approach shared by Studies 1d and the current study, there appears to be a less consistency in the “asymmetry” between BODY and MIND in than there was using the “edge cases” approach of Studies 1a-1c and Study 2.

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.6, panel A3). As in Study 1, the most striking features of this visualization are that (1) there is a positive relationship between scores on the HEART and MIND scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the lower right quadrant. Individual participants tended to endorse the mental capacity items included in the MIND scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more MIND than HEART to the target character in question, but virtually no participants attributed more HEART than MIND.

Visual inspection of mean scores by target character further reveals that, in the aggregate, characters that received low MIND scores (the two inert toys: a teddy bear and a doll) also received low mean HEART scores, while characters that received relatively high MIND scores (e.g., the robot and all of the animate beings) varied in their mean HEART scores. Again, this echoes the intriguing possibility, raised by Study 1d, that attributions of HEART and MIND may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of MIND. (Again, this will not be explored further in the current dissertation.)

Interim discussion

My informal observations of the relationships among adults’ endorsements of the conceptual units in Study 3 are very similar to those for adults in Studies 1 and 2 (particularly Study 1d, which also employed the “diverse characters” approach taken here): (1) All of these inter-unit relationships were positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) There were robust asymmetries in these positive relationships, such that participants tended to endorse either BODY or MIND more strongly than HEART. As in Study 1d, the relationship between BODY vs. MIND appears to be more variable across participants and across target characters than the generally asymmetrical relationship (with participants tending to attribute more MIND than BODY) that emerged in studies that used the “edge case” approach (Studies 1a-1c and Study 2).

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.7, panel A, for visual depictions of these difference scores.

BODY vs. HEART

As in Studies 1 and 2, difference scores comparing the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.6). This asymmetry was driven by responses to the animate beings (and was substantially more pronounced for goat, mouse, beetle); among inanimate beings, difference scores hovered around zero (and were substantially less pronounced for teddy bear, doll, robot; see the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6.

BODY vs. MIND

As in Studies 1 and 2, on the whole, difference scores comparing the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.6). However, this asymmetry was driven by responses to the two technologies (particularly the robot). It was much less pronounced—and in some cases ran in the opposite direction—for other characters (particularly elephant, goat, mouse, beetle); see the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.6.

HEART vs. MIND

As in Studies 1 and 2, difference scores comparing the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.6). Again, this asymmetry was more pronounced for some characters (mouse, beetle, robot), and less pronounced for others (namely, the two inert toys: teddy bear, doll; see the various comparisons of target characters to the grand mean for the “HEART-MIND” comparison in Table 4.6).

Interim discussion

These formal analyses of difference scores across the BODY, HEART, and MIND scales among adults in Study 3 confirm my informal observations of asymmetries described in the previous section, echoing the analyses of adults in Studies 1 and 2: Across all of these studies, participants tended to endorse both BODY and MIND more strongly than HEART, while the asymmetry between MIND and BODY was contingent on the type of target character under consideration.

Children (7-9y)

XX INSERT SECTION INTRODUCTION/TRANSITION

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.6, row B.

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.6, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more BODY than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than BODY. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for a target character of particular interest—the robot—with children tending to attribute more BODY than HEART to this unusual social partner.

Echoing the visualizations of adults’ responses, there do appear to be two suites of characters in this visualization: inanimate objects (characterized by generally low BODY scores) and animate beings (characterized by generally high BODY scores). However, while among adults only animate beings varied in their mean HEART scores, among children there appears to be substantial variability in HEART scores in both of these groups of characters. In other words, this visualization does not provide evidence of the kind of “threshold” model discussed for adults.

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.6, panel B2). Among adults, the relationships between scores on the BODY and MIND scales was clearly positive, and there were notably fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but neither of these observations is particularly striking among children in this sample. In other words, while some children attributed more BODY than HEART to the target character in question (particularly if they were evaluating one of the two technologies), others attributed more HEART than BODY (particularly if they were evaluating one of animate beings). This echoes the differences across characters in the strength and direction of asymmetries between BODY and MIND observed among adults in this study; indeed, such between-character differences appear to be even more pronounced among children.

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.6, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but again both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. Visual inspection of mean scores by target character reveals no evidence of the kind of “threshold” model discussed for adults.

Interim discussion

As in the comparison of adults and children in Study 2, my informal observations of the relationships among older children’s endorsements of the conceptual units in Study 3 are broadly similar to those of adults in this study, but dramatically attenuated: (1) These inter-unit relationships were what positive, but only somewhat; and (2) There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons).

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.7, panel B, for visual depictions of these difference scores.

BODY vs. HEART

As among adults, difference scores comparing the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.6). Like adults, older children’s asymmetry was driven by responses to the animate beings (and was substantially more pronounced for goat, mouse, bird, beetle); among inanimate beings, difference scores hovered around (or below) zero (and were substantially less pronounced for teddy bear, doll, robot; see the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6.

BODY vs. MIND

difference scores comparing the BODY and MIND scales were not substantially different from zero, in contrast to analyses of adults (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.6). This appears to be due to the fact that the asymmetry went in different directions for different characters: Older children tended to attributed more MIND than BODY t the two technologies (robot, computer), but tended to attributed more BODY than MIND to the animate beings (particularly elephant, goat, mouse, bird); see the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.6.

HEART vs. MIND

As among adults, difference scores comparing the HEART and MIND scales were substantially non-zero, in the direction of children endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.6). This asymmetry appeared to hold true across the range of target characters included in this study, and less pronounced for others; see the various comparisons of target characters to the grand mean for the “HEART-MIND” comparison in Table 4.6.

Interim discussion

These formal analyses of difference scores across the BODY, HEART, and MIND scales among older children (7-9y) in Study 3 confirm my informal observations in the previous section: Older children tended to endorse both BODY and MIND more strongly than HEART, while the asymmetry between MIND and BODY was highly contingent on the type of target character under consideration.

Children (4-6y)

XX INSERT SECTION INTRODUCTION/TRANSITION

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.6, row C.

In contrast to the visualizations of these relationships among adults and older children (7-9y of age), among younger children the relationships between BODY, HEART, and MIND (as indexed by adults’ scales) all looked rather similar. In particular, for each pair of conceptual units, there appeared to be a somewhat positive relationship between scores on the two scales; this aligns with my informal observations of adults and older children. In each case (particularly in the BODY vs. HEART and BODY vs. MIND comparisons), two suites of characters emerged: A group of inanimate objects (which, in the aggregate, received moderately low scores on all scales), and a group of animate beings (which, in the aggregate, received moderately high scores on all scales).

An informal inspection of these visualizations suggests only moderate asymmetries in younger children’s attributions of BODY, HEART, and MIND capacities. In the case of BODY vs. HEART, younger children tended to attribute more BODY than HEART (panel C1), but this tendency was quite weak. In the case of BODY vs. MIND (panel C2), younger children’s tended (again, weakly) to attribute more BODY than MIND—the opposite direction of adults and older children. In the case of HEART vs. MIND, this visualization (panel C3) suggests no systematic asymmetry in younger children’s attributions.

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries (or lack thereof) revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.7, panel C, for visual depictions of these difference scores.

BODY vs. HEART

As among adults and older children, difference scores comparing the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.6). As with adults and older children, this asymmetry appears to have been driven by responses to the animate beings, while difference scores for inanimate beings hovered around (or below) zero; see the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6.

BODY vs. MIND

difference scores comparing the BODY and HEART scales were substantially non-zero—but in contrasts to older children and adults, among younger children this asymmetry ran in the direction of participants attributing more BODY than MIND (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.6). This asymmetry appears to have been driven by responses to animate beings (and was particularly pronounced for particularly goat, mouse); see the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.6.

HEART vs. MIND

In contrast to adults and older children, among younger children difference scores comparing the HEART and MIND scales did not differ substantially from zero, and varied only subtly across target characters; see the various comparisons of target characters to the grand mean for the “HEART-MIND” comparison in Table 4.6.

Interim discussion

These formal analyses of difference scores across the BODY, HEART, and MIND scales among younger children (4-6y) in Study 3 confirm my informal observations in the previous section. Like older children and adults, younger children tended to endorse BODY more strongly than HEART. However, younger children diverged from their older counterparts by systematically endorsing BODY more strongly than MIND, and by failing to show any systematic asymmetry between HEART and MIND.

Developmental comparison

In the previous sections, I analyzed adults’, older children’s, and younger children’s responses separately. Here I conduct a formal comparison of difference scores between conceptual units among these three age groups, to assess the size and robustness of these ostensive developmental differences.

BODY vs. HEART

Difference scores between the BODY and HEART scales were substantially closer to zero among both older and younger children, as compared to adults (see the “Older vs. adults” and “Younger children vs. adults” rows for the “BODY-HEART” comparison in Table 4.7). A handful of the differences between target characters differed substantially across age groups (see the “Interaction” row for the “BODY-HEART” comparison in Table 4.7); this is outside of the scope of the current chapter.

BODY vs. MIND

Difference scores between the BODY and MIND scales were not differentiable from adults among older children in this analysis, but reversed in sign among younger children (see the “Older vs. adults” and “Younger children vs. adults” rows for the “BODY-MIND” comparison in Table 4.7). Again, handful of the differences between target characters differed substantially across age groups (see the “Interaction” row for the “BODY-MIND” comparison in Table 4.7); this is outside of the scope of the current chapter.

HEART vs. MIND

Difference scores between the HEART and MIND scales were substantially closer to zero among both older children and younger children, as compared to adults (see the “Older children vs. adults” and “Younger children vs. adults” rows for the “HEART-MIND” comparison in Table 4.7), Again, handful of the differences between target characters differed substantially across age groups (see the “Interaction” row for the “HEART-MIND” comparison in Table 4.7); this is outside of the scope of the current chapter.

Interim discussion

These formal comparisons of difference scores among younger children (4-6y), older children (7-9y), and adults in Study 3 confirm my earlier observations that asymmetries were substantially attenuated among both older and especially younger children, relative to the baseline set by adults. The only exceptions to this rule were (1) The BODY vs. MIND difference scores among older children was not differentiable from those of adults (likely because this was the weakest of the asymmetries among adults); and (2) The BODY vs. MIND difference scores among younger children ran in the opposite direction to those of adults (as discussed in my earlier description of younger children’s responses).

Discussion

XX INSERT STUDY 3 DISCUSSION

Table 4.6: Regression analyses of difference scores among US adults, older children (7-9y of age), and younger children (4-6y of age) in Study 3. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Adults
Children, 7-9y (using adults' scales)
Children, 4-6y (using adults' scales)
Parameter b 95% CI b 95% CI b 95% CI
BODY - HEART
Intercept 0.29 [ 0.24, 0.33] * 0.07 [ 0.03, 0.11] * 0.14 [ 0.09, 0.18] *
Elephant vs. GM 0.03 [-0.08, 0.13] 0.04 [-0.07, 0.16] 0.08 [-0.04, 0.20]
Goat vs. GM 0.24 [ 0.14, 0.34] * 0.10 [-0.02, 0.21] 0.19 [ 0.06, 0.31] *
Mouse vs. GM 0.45 [ 0.32, 0.59] * 0.09 [-0.02, 0.20] 0.17 [ 0.05, 0.30] *
Bird vs. GM 0.06 [-0.05, 0.18] 0.18 [ 0.06, 0.30] * 0.19 [ 0.07, 0.31] *
Beetle vs. GM 0.36 [ 0.23, 0.48] * 0.02 [-0.10, 0.13] 0.21 [ 0.10, 0.33] *
Teddy bear vs. GM -0.33 [-0.49, -0.16] * -0.04 [-0.14, 0.07] -0.25 [-0.40, -0.11] *
Doll vs. GM -0.30 [-0.40, -0.19] * -0.14 [-0.26, -0.03] * -0.14 [-0.27, -0.01] *
Robot vs. GM -0.27 [-0.37, -0.16] * -0.18 [-0.30, -0.06] * -0.37 [-0.50, -0.25] *
BODY - MIND
Intercept -0.06 [-0.10, -0.03] * 0.11 [ 0.06, 0.15] * -0.01 [-0.05, 0.03]
Elephant vs. GM 0.12 [ 0.04, 0.21] * 0.12 [-0.02, 0.26] 0.19 [ 0.08, 0.29] *
Goat vs. GM 0.20 [ 0.12, 0.28] * 0.17 [ 0.03, 0.31] * 0.25 [ 0.13, 0.37] *
Mouse vs. GM 0.14 [ 0.03, 0.25] * 0.26 [ 0.13, 0.40] * 0.21 [ 0.09, 0.32] *
Bird vs. GM 0.06 [-0.03, 0.15] 0.07 [-0.08, 0.22] 0.25 [ 0.13, 0.37] *
Beetle vs. GM 0.15 [ 0.06, 0.25] * -0.01 [-0.16, 0.13] 0.10 [-0.01, 0.21]
Teddy bear vs. GM 0.12 [-0.02, 0.25] -0.14 [-0.27, -0.01] * 0.08 [-0.06, 0.22]
Doll vs. GM 0.05 [-0.03, 0.14] -0.14 [-0.28, 0.00] -0.07 [-0.20, 0.05]
Robot vs. GM -0.56 [-0.64, -0.48] * -0.09 [-0.23, 0.06] -0.52 [-0.64, -0.40] *
HEART - MIND
Intercept -0.35 [-0.40, -0.30] * 0.03 [-0.02, 0.08] -0.14 [-0.21, -0.08] *
Elephant vs. GM 0.10 [-0.02, 0.22] 0.08 [-0.07, 0.21] 0.11 [-0.05, 0.26]
Goat vs. GM -0.04 [-0.16, 0.07] 0.07 [-0.06, 0.21] 0.06 [-0.11, 0.24]
Mouse vs. GM -0.32 [-0.48, -0.16] * 0.17 [ 0.04, 0.31] * 0.04 [-0.13, 0.21]
Bird vs. GM 0.00 [-0.13, 0.14] -0.12 [-0.27, 0.04] 0.06 [-0.11, 0.23]
Beetle vs. GM -0.20 [-0.36, -0.05] * -0.03 [-0.17, 0.11] -0.12 [-0.28, 0.04]
Teddy bear vs. GM 0.44 [ 0.24, 0.65] * -0.10 [-0.23, 0.02] 0.33 [ 0.14, 0.53] *
Doll vs. GM 0.35 [ 0.22, 0.48] * 0.00 [-0.14, 0.15] 0.07 [-0.11, 0.24]
Robot vs. GM -0.29 [-0.41, -0.17] * 0.09 [-0.06, 0.24] -0.14 [-0.30, 0.03]
Table 4.7: Regression analyses of differences in difference scores between US adults and both older children (7-9y of age) and younger children (4-6y of age) in Study 3. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) a difference between target characters (among adults), reported here as a difference between the robot and the grand mean (GM); (3) the overall difference between children and adults (collapsing across target characters); and (4) the interaction between this age difference and the difference between target characters. The developmental comparisons of the intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Developmental comparison
Parameter b 95% CI
BODY - HEART
Intercept 0.29 [ 0.24, 0.33] *
Older children vs. adults -0.15 [-0.21, -0.09] *
Younger children vs. adults -0.21 [-0.28, -0.15] *
Elephant vs. GM 0.03 [-0.09, 0.14]
Goat vs. GM 0.24 [ 0.13, 0.35] *
Mouse vs. GM 0.46 [ 0.31, 0.61] *
Bird vs. GM 0.06 [-0.06, 0.18]
Beetle vs. GM 0.36 [ 0.23, 0.49] *
Teddy bear vs. GM -0.33 [-0.50, -0.16] *
Doll vs. GM -0.30 [-0.41, -0.18] *
Robot vs. GM -0.27 [-0.37, -0.16] *
Older children vs. adults * Elephant vs. GM 0.05 [-0.10, 0.21]
Older children vs. adults * Goat vs. GM -0.06 [-0.22, 0.09]
Older children vs. adults * Mouse vs. GM -0.29 [-0.47, -0.10] *
Older children vs. adults * Bird vs. GM 0.13 [-0.03, 0.30]
Older children vs. adults * Beetle vs. GM -0.14 [-0.31, 0.03]
Older children vs. adults * Teddy bear vs. GM 0.07 [-0.15, 0.29]
Older children vs. adults * Doll vs. GM 0.15 [-0.02, 0.33]
Older children vs. adults * Robot vs. GM -0.11 [-0.27, 0.05]
Younger children vs. adults * Elephant vs. GM 0.02 [-0.15, 0.18]
Younger children vs. adults * Goat vs. GM -0.14 [-0.30, 0.02]
Younger children vs. adults * Mouse vs. GM -0.36 [-0.56, -0.18] *
Younger children vs. adults * Bird vs. GM 0.12 [-0.04, 0.30]
Younger children vs. adults * Beetle vs. GM -0.34 [-0.52, -0.17] *
Younger children vs. adults * Teddy bear vs. GM 0.29 [ 0.09, 0.49] *
Younger children vs. adults * Doll vs. GM 0.15 [-0.02, 0.32]
Younger children vs. adults * Robot vs. GM 0.09 [-0.07, 0.25]
BODY - MIND
Intercept -0.06 [-0.11, -0.02] *
Older children vs. adults 0.05 [-0.01, 0.12]
Younger children vs. adults 0.17 [ 0.11, 0.23] *
Elephant vs. GM 0.12 [ 0.00, 0.24] *
Goat vs. GM 0.20 [ 0.09, 0.30] *
Mouse vs. GM 0.14 [ 0.00, 0.28] *
Bird vs. GM 0.06 [-0.05, 0.18]
Beetle vs. GM 0.15 [ 0.02, 0.29] *
Teddy bear vs. GM 0.12 [-0.05, 0.29]
Doll vs. GM 0.05 [-0.06, 0.16]
Robot vs. GM -0.56 [-0.66, -0.45] *
Older children vs. adults * Elephant vs. GM 0.07 [-0.09, 0.23]
Older children vs. adults * Goat vs. GM 0.06 [-0.11, 0.22]
Older children vs. adults * Mouse vs. GM 0.07 [-0.11, 0.25]
Older children vs. adults * Bird vs. GM 0.19 [ 0.03, 0.36] *
Older children vs. adults * Beetle vs. GM -0.05 [-0.23, 0.12]
Older children vs. adults * Teddy bear vs. GM -0.04 [-0.26, 0.17]
Older children vs. adults * Doll vs. GM -0.13 [-0.29, 0.04]
Older children vs. adults * Robot vs. GM 0.04 [-0.12, 0.20]
Younger children vs. adults * Elephant vs. GM 0.00 [-0.17, 0.17]
Younger children vs. adults * Goat vs. GM -0.02 [-0.18, 0.13]
Younger children vs. adults * Mouse vs. GM 0.13 [-0.06, 0.31]
Younger children vs. adults * Bird vs. GM 0.00 [-0.17, 0.18]
Younger children vs. adults * Beetle vs. GM -0.16 [-0.34, 0.02]
Younger children vs. adults * Teddy bear vs. GM -0.26 [-0.47, -0.06] *
Younger children vs. adults * Doll vs. GM -0.19 [-0.35, -0.02] *
Younger children vs. adults * Robot vs. GM 0.47 [ 0.30, 0.64] *
HEART - MIND
Intercept -0.35 [-0.40, -0.29] *
Older children vs. adults 0.20 [ 0.13, 0.28] *
Younger children vs. adults 0.38 [ 0.31, 0.46] *
Elephant vs. GM 0.10 [-0.05, 0.23]
Goat vs. GM -0.05 [-0.18, 0.08]
Mouse vs. GM -0.32 [-0.50, -0.14] *
Bird vs. GM 0.00 [-0.15, 0.14]
Beetle vs. GM -0.21 [-0.37, -0.04] *
Teddy bear vs. GM 0.45 [ 0.23, 0.66] *
Doll vs. GM 0.35 [ 0.21, 0.49] *
Robot vs. GM -0.29 [-0.42, -0.16] *
Older children vs. adults * Elephant vs. GM 0.01 [-0.19, 0.21]
Older children vs. adults * Goat vs. GM 0.11 [-0.09, 0.31]
Older children vs. adults * Mouse vs. GM 0.36 [ 0.14, 0.59] *
Older children vs. adults * Bird vs. GM 0.06 [-0.14, 0.26]
Older children vs. adults * Beetle vs. GM 0.09 [-0.12, 0.31]
Older children vs. adults * Teddy bear vs. GM -0.12 [-0.40, 0.15]
Older children vs. adults * Doll vs. GM -0.28 [-0.49, -0.08] *
Older children vs. adults * Robot vs. GM 0.15 [-0.06, 0.35]
Younger children vs. adults * Elephant vs. GM -0.02 [-0.22, 0.19]
Younger children vs. adults * Goat vs. GM 0.12 [-0.08, 0.31]
Younger children vs. adults * Mouse vs. GM 0.49 [ 0.27, 0.72] *
Younger children vs. adults * Bird vs. GM -0.12 [-0.33, 0.09]
Younger children vs. adults * Beetle vs. GM 0.18 [-0.05, 0.41]
Younger children vs. adults * Teddy bear vs. GM -0.55 [-0.81, -0.30] *
Younger children vs. adults * Doll vs. GM -0.34 [-0.55, -0.12] *
Younger children vs. adults * Robot vs. GM 0.38 [ 0.18, 0.59] *

Study 4: A focus on early childhood (4-5y)

In the context of this dissertation, Study 4 serves to provide a targeted investigation of representations of mental life in the preschool years (4-5y). In this chapter, I again focus on what this study can reveal about the relationships among the conceptual units BODY, HEART, and MIND at the earliest point in development that I have been able to test so far, and compare this conceptual organization to that documented among adults. As a reminder, in this chapter I analyze young children’s responses with respect to the “mature” conceptual units BODY, HEART, and MIND, as defined by EFA of adults’ responses (see [XX APPENDIX B?] for further analyses with respect to the conceptual units identified through EFA of children’s own mental capacity attributions, as presented in Chapter III).

In Study 4, 104 US adults and 43 US children between the ages of 4.02-5.59 years (median: 4.73y) each assessed two target characters on 18 mental capacities. To make the study appropriate for children in this age range, this study employed a new set of 18 mental capacities (some but not all of which were used in Studies 1-3). In addition, participants were presented with a more child-friendly visual representation of the 3-point response scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants assessing both a beetle or a robot in sequence (with order counterbalanced across participants). (See Chapter II for detailed methods.)

Results

Adults

Scale construction

Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 5 items each; see Table 4.10.

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.8, row A.

These visualizations are all extremely similar to those discussed at length in Studies 1a-1c and Study 2; I will not describe them further here.

Analysis of asymmetries

Here I provide a formal analysis of these asymmetries. As in previous studies, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies. As in Study 1d, I account for the within-subjects design by included maximal random effects structure (in this case, random intercepts for participants). See Figure 4.9, panel D, for visual depictions of these difference scores.

BODY vs. HEART

As in previous studies, difference scores comparing adults’ scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.8). Again, this difference was driven by participants’ assessments of the beetle; in the aggregate, difference scores were reduced to 0 for the robot (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.8).

BODY vs. MIND

As previous studies, difference scores comparing adults’ scores on the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.8). Again, this difference was driven by participants’ assessments of the robot; in the aggregate, difference scores tended to be greater, not less, than zero for the beetle (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.8).

HEART vs. MIND

As in previous studies, difference scores comparing adults’ scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.8). Again, this difference was somewhat exaggerated in assessments of the robot, relative to the beetle (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.8).

Interim discussion

These formal analyses of difference scores across the BODY, HEART, and MIND scales among adults in Study 4 confirm my informal observations of asymmetries described in the previous section, and align quite closely with analyses of adults in Studies 1a-1c and Study 2: Across all of the studies that used the “edge case approach” to inducing variability in mental capacity attributions, adults tended to endorse MIND more strongly than BODY or HEART, and BODY more strongly than HEART.

Children (4-5y)

XX INSERT SECTION INTRODUCTION/TRANSITION

Visualization

Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.8, row B.

BODY vs. HEART

First I will consider the relationship between BODY and HEART (Figure 4.8, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it—but both of these observations are much less striking among children than they were among adults. In other words, while, like the vast majority of adults, many children attributed more BODY than HEART to the target character in question (particularly to the beetle, in red), quite a few children attributed more HEART than BODY (particularly to the robot, in blue).

BODY vs. MIND

Next I will consider the relationship between BODY and MIND (Figure 4.8, panel B2). As among adults in this study (panel A2), the relationship between scores on the BODY and MIND scales appears to be somewhat positive, there is no obvious evidence of any asymmetry in children’s attributions of these two conceptual units. In other words, while, like the majority of adults, some children attributed more MIND than BODY to the target character in question (particularly to the robot, in blue), other children attributed more BODY than MIND (particularly to the beetle, in red). This is reminiscent of my earlier observation among older children (7-9y) in Study 2, where the relationship between BODY and MIND scores went in opposite directions for these two “edge cases.”

HEART vs. MIND

Finally I will consider the relationship between HEART and MIND (Figure 4.8, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous sections, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. This appears to have been true for both target characters.

Interim discussion

Using a particularly child-friendly paradigm, the relationships young children’s endorsements of BODY, HEART, and MIND (as defined by adults’ EFA solution) appear to be slightly more resonant with the relationships observed among adults. All of these inter-unit relationships were somewhat positive—but only somewhat. There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons, as was the case in Study 2 with older children).

Analysis of asymmetries

Here I provide a formal analysis of the asymmetries (or lack thereof) revealed by the visualizations in the previous section. As in previous analyses, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (beetle and robot), and accounting for the within-subjects design of this study by including maximal random effects structures (in this case, random intercepts for participants). See Figure 4.9, panel B, for visual depictions of these difference scores.

BODY vs. HEART

As among adults, among children difference scores comparing the BODY and HEART scales were significantly non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.8). However, this asymmetry was reduced to zero for assessments of the robot (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.8).

BODY vs. MIND

In contrast to adults, among children difference scores comparing the BODY and MIND scales were not differentiable from zero (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.8). This appears to be due to the fact that the asymmetry ran in different directions for the two target characters (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.8).

HEART vs. MIND

As among adults, among children difference scores comparing the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.8), and this difference was slightly exaggerated in assessments of the robot (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.8).

Interim discussion

These formal analyses of difference scores across the BODY, HEART, and MIND scales among children in Study 4 confirm my informal observations that in this particularly child-friendly paradigm, young children were adult-like in their tendency to endorse BODY and MIND more strongly than HEART, while failing to show the adult-like tendency to endorse MIND more strongly than BODY for these two edge cases. Instead, like children in other studies (XX INSERT REFERENCES), the asymmetry between BODY and MIND appeared to depend on which target was being assessed.

Developmental comparison

In the previous sections, I analyzed adults’ and children’s responses separately. Here I conduct a formal comparison of difference scores between conceptual units among these two age groups, to assess the size and robustness of these ostensive developmental differences.

BODY vs. HEART

Difference scores between the BODY and HEART scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-HEART” comparison in Table 4.9), and the difference between target characters was attenuated among children (see the “Interaction” row for the “BODY-HEART” comparison in Table 4.9).

BODY vs. MIND

Difference scores between the BODY and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-MIND” comparison in Table 4.9), and the difference between target characters was attenuated among children (see the “Interaction” row for the “BODY-MIND” comparison in Table 4.9).

HEART vs. MIND

Difference scores between the HEART and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “HEART-MIND” comparison in Table 4.9), and the difference between target characters was attenuated among children (see the “Interaction” row for the “HEART-MIND” comparison in Table 4.9).

Interim discussion

These formal comparisons of difference scores among children vs. adults in Study 4 confirm my earlier observations that asymmetries were substantially attenuated (and in some cases, reduced to zero) among children, relative to the baseline set by adults. In addition, among children the differences in these asymmetries between the two “edge cases” included in this study (the beetle vs. the robot) were also attenuated, relative to adults.

Discussion

XX INSERT STUDY 4 DISCUSSION

Table 4.8: Regression analyses of difference scores among US adults and children (4-5y of age) in Study 4. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Adults
Children, 4-6y (using adults' scales)
Parameter b 95% CI b 95% CI
BODY - HEART
Intercept 0.27 [ 0.24, 0.31] * 0.10 [ 0.03, 0.16] *
Robot vs. GM -0.27 [-0.31, -0.24] * -0.17 [-0.23, -0.11] *
BODY - MIND
Intercept -0.20 [-0.24, -0.17] * -0.01 [-0.08, 0.05]
Robot vs. GM -0.37 [-0.40, -0.34] * -0.18 [-0.24, -0.12] *
HEART - MIND
Intercept -0.48 [-0.52, -0.43] * -0.11 [-0.17, -0.04] *
Robot vs. GM -0.10 [-0.14, -0.06] * -0.02 [-0.07, 0.04]
Table 4.9: Regression analyses of differences in difference scores between US adults and children (4-5y of age) difference scores in Study 4. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) a difference between target characters (among adults), reported here as a difference between the robot and the grand mean (GM); (3) the overall difference between children and adults (collapsing across target characters); and (4) the interaction between this age difference and the difference between target characters. The developmental comparisons are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
Developmental comparison
Parameter b 95% CI
BODY - HEART
Intercept 0.27 [ 0.24, 0.31] *
Children vs. adults -0.18 [-0.24, -0.11] *
Robot vs. GM -0.27 [-0.31, -0.24] *
Interaction 0.11 [ 0.04, 0.17] *
BODY - MIND
Intercept -0.20 [-0.24, -0.17] *
Children vs. adults 0.19 [ 0.13, 0.26] *
Robot vs. GM -0.37 [-0.41, -0.34] *
Interaction 0.19 [ 0.12, 0.25] *
HEART - MIND
Intercept -0.48 [-0.52, -0.43] *
Children vs. adults 0.37 [ 0.29, 0.45] *
Robot vs. GM -0.10 [-0.13, -0.06] *
Interaction 0.08 [ 0.01, 0.15] *
Table 4.10: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 2-4 and for 7- to 9-year-old children in Studies 2 and 3. (See Appendix B for alternative scales based on younger children's EFA results, for Studies 3 and 4.) A checkmark indicates that a mental capacity was included in a scale for a particular sample.
Study 2
Study 3
Study 4
Capacity Adults Children, 7-9y Adults Children, 7-9y Adults
BODY scale
get/feel hungry
feel pain
feel/get scared
feel tired
feel safe
smell things
get/feel sick[...]
get thirsty
get angry
HEART scale
feel proud
feel joy
feel/get sad
feel happy
feel love/love someone
feel guilty/sorry
get hurt feelings
feel embarrassed
hate someone
get lonely
MIND scale
figure out how to do things/figure things out
make choices
recognize somebody else
sense...far away
remember things
see [things]
be aware of itself
be aware of things
sense temperatures
know stuff
have thoughts/think
hear [sounds]

General discussion

XX INSERT SECTION INTRODUCTION

XX INSERT DISCUSSION

outline:

  • adults:
    • BODY and (especially) MIND more basic than HEART
    • MIND perhaps more basic than BODY, but more contingent on characters: strongest for between-Ss comparisons of edge cases (Studies 1a-1c and Study 2), weaker in within-Ss version (Study 4), weakest for diverse characters (Studies 1d and Study 3)
    • [“threshold” model?]
  • older children:
    • like adults, MIND more basic than HEART
    • BODY perhaps more basic than HEART (like adults), but only in diverse characters approach (Study 3), not edge cases (Study 2) - perhaps because of developmental diffs in assessments of the robot? (revisit in ch05)
    • like adults, MIND perhaps more basic than BODY, but only in edge case approach (Study 2), not diverse characters (Study 3)
    • generally, all asymmetries weaker
    • [no evidence of “threshold” model]
  • younger children:
    • like adults, BODY more basic than HEART (more “adult-like” than older children are!)
    • MIND perhaps more basic than HEART (like adults/older children), but only in edge case approach (Study 4), not diverse characters (Study 3) - why? perhaps because of robot?
    • unlike adults/older children, BODY perhaps more basic than MIND, but only in diverse characters approach (Study 3), not edge cases (Study 4) - why?
    • generally, all asymmetries weaker, even compared to older children
    • [no evidence of “threshold” model]

XX INSERT DISCUSSION OF IMPLICATIONS

Chapter conclusion

In this chapter, I explored a second aspect of conceptual representations of mental life among US children and adults: The relationships among conceptual units. Studies 2-4 are consistent with the following theory: XX.

As in Chapter III, I urge the reader to remember that this is not the only possible interpretation of the pattern of results presented here; additional studies—in particular, studies designed to test the hypothesis that XX— could provide converging evidence or could challenge this theoretical interpretation. Instead, the primary role of the re-analysis discussed here has been to inspire the hypothesis stated in the previous paragraph and to the foundation for future tests of this hypothesis, in turn refining a general theory of this aspect of conceptual development.

In the next chapter, I apply the same exploratory spirit to the third and final aspect of conceptual representations of mental life: the application or deployment of these conceptual units in reasoning about various kinds of beings.

LS0tCnRpdGxlOiAiQ2hhcHRlciBJVjogQ2hhbmdlcyBpbiBvcmdhbml6YXRpb24gb2YgY29uY2VwdHVhbCB1bml0cyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNjcsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CiMgIyBmb3Iga25pdHRpbmcgdG8gLmRvY3gKIyBvdXRwdXQ6CiMgICB3b3JkX2RvY3VtZW50OgojICAgICByZWZlcmVuY2VfZG9jeDogIi4vc3RvcmVkL3dvcmQtc3R5bGVzLXJlZmVyZW5jZS5kb2N4IgojIGFsd2F5c19hbGxvd19odG1sOiB5ZXMKCiMgIyBmb3Iga25pdHRpbmcgdG8gLm5iLmh0bWwgCiMgb3V0cHV0OgojICAgaHRtbF9ub3RlYm9vazoKIyAgICAgdG9jOiB5ZXMKIyAgICAgdG9jX2RlcHRoOiA0CiMgICAgIHRvY19mbG9hdDogeWVzCmBgYAoKYGBge3J9CiMgcnVuIHVyLXNldHVwIHNjcmlwdCAod2hpY2ggcnVucyBvdGhlciBzY3JpcHRzKQpzb3VyY2UoIi4vc2NyaXB0cy9fU0VUVVAuUiIpCgojIGxvYWQgaW4gRUZBcyAmIG5hbWVzIGZyb20gQ2hhcHRlciBJSUkKc291cmNlKCIuL3NjcmlwdHMvc3RvcmVkX2NoMDMuUiIpCmBgYAoKCiMgQ2hhcHRlciBvdmVydmlldwoKSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHRoZSBzZWNvbmQgb2YgbXkgdGhyZWUga2V5IHF1ZXN0aW9ucyBhYm91dCB0aGUgZGV2ZWxvcG1lbnQgb2YgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiBfSG93IGFyZSB0aGUgY29uY2VwdHVhbCB1bml0cyB0aGF0IGFuY2hvciByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgb3JnYW5pemVkIGluIHJlbGF0aW9uIHRvIGVhY2ggb3RoZXIsIGFuZCBob3cgZG9lcyB0aGlzIG9yZ2FuaXphdGlvbiBjaGFuZ2Ugb3ZlciBkZXZlbG9wbWVudD9fIEFzIGluIENoYXB0ZXIgSUlJLCB0byBhZGRyZXNzIHRoaXMgcXVlc3Rpb24gSSBkcmF3IG9uIGRhdGEgZnJvbSBhbGwgb2YgdGhlIGN1cnJlbnQgc3R1ZGllcyAoU3R1ZGllcyAxLTQpOyBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWV0aG9kcyBvZiB0aGVzZSBzdHVkaWVzLCBzZWUgQ2hhcHRlciBJSS4gVGhlIGdvYWwgb2YgdGhpcyBjaGFwdGVyIGlzIHRvIHByb3ZpZGUgInNuYXBzaG90cyIgb2YgdGhlIG9yZ2FuaXphdGlvbiBvZiBjb25jZXB0dWFsIHVuaXRzIGluIGVhcmx5IGNoaWxkaG9vZCwgbWlkZGxlIGNoaWxkaG9vZCwgYW5kIGFkdWx0aG9vZC4KCgojIEdlbmVyYWwgYW5hbHlzaXMgcGxhbgoKIyMgSGlnaC1sZXZlbCBvdmVydmlldwoKTXkgZ29hbCBpbiB0aGlzIGNoYXB0ZXIgaXMgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgImNvbmNlcHR1YWwgdW5pdHMiIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUkuIEhvdyBkb2VzIGEgcGFydGljaXBhbnQncyBhc3Nlc3NtZW50IG9mIG9uZSBjb25jZXB0dWFsIHVuaXQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCB0aGUgZGVncmVlIHRvIHdoaWNoIGhlIG9yIHNoZSBpbmRpY2F0ZXMgdGhhdCBhIGJlZXRsZSBpcyBjYXBhYmxlIG9mIHRoZSBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgb2YgdGhlIEJPRFkpIGFmZmVjdCB0aGF0IHBhcnRpY2lwYW50J3MgYXNzZXNzbWVudHMgb2Ygb3RoZXIgY29uY2VwdHVhbCB1bml0cyBmb3IgdGhhdCB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCBoaXMgb3IgaGVyIGFzc2Vzc21lbnQgb2YgdGhlIGJlZXRsZSdzIGNhcGFjaXRpZXMgaW4gdGhlIGRvbWFpbnMgb2YgSEVBUlQgb3IgTUlORCk/CgpJIGZvY3VzIGluIHBhcnRpY3VsYXIgb24gdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZG9jdW1lbnRlZCBieSB0aGUgc3R1ZGllcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3NlcnRhdGlvbuKAlHJlLWFuYWx5emVkIGFzIGluZGljYXRvcnMgb2YgdGhlIGJyb2FkZXIgImNvbmNlcHR1YWwgdW5pdHMiIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUnigJRtaWdodCBzaGVkIGxpZ2h0IG9uIHRoZSBfaGllcmFyY2hpY2FsIG9yZ2FuaXphdGlvbl8gb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cywgaS5lLiwgd2hpY2ggY29uY2VwdHVhbCB1bml0cyBtaWdodCBiZSBtb3JlIGJhc2ljIG9yIGZ1bmRhbWVudGFsIHZzLiBtb3JlIGNvbXBsZXgsIGFuZCB3aGV0aGVyIGFueSBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBjb25zaWRlcmVkIHRvIGRlcGVuZCBvbiB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXJzLiBJbiBDaGFwdGVyIElJLCBJIGlsbHVzdHJhdGVkIHRoaXMgd2l0aCB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IElmIG1hbnkgcGFydGljaXBhbnRzIGVuZG9yc2UgY2FwYWNpdGllcyBhc3NvY2lhdGVkIHdpdGggQ29uY2VwdHVhbCBVbml0IEEgd2l0aG91dCBlbmRvcnNpbmcgY2FwYWNpdGllcyBhc3NvY2lhdGVkIHdpdGggQ29uY2VwdHVhbCBVbml0IEIsIGJ1dCB2ZXJ5IGZldyBwYXJ0aWNpcGFudHMgZG8gdGhlIHJldmVyc2UgKGVuZG9yc2luZyBjYXBhY2l0aWVzIGFzc29jaWF0ZWQgd2l0aCBDb25jZXB0dWFsIFVuaXQgQiBidXQgbm90IENvbmNlcHR1YWwgVW5pdCBBKSwgdGhpcyBwcm92aWRlcyBzb21lIGV2aWRlbmNlIHRoYXQgQ29uY2VwdHVhbCBVbml0IEEgaXMgbW9yZSBiYXNpYyBvciBmdW5kYW1lbnRhbCB0aGFuIENvbmNlcHR1YWwgVW5pdCBCLCBvciB0aGF0IENvbmNlcHR1YWwgVW5pdCBCIHNvbWVob3cgZGVwZW5kcyBvbiAocGVyaGFwcyByZXF1aXJlcykgQ29uY2VwdHVhbCBVbml0IEEuIAoKSGVyZSBJIHdpbGwgdHJhbnNsYXRlIHRoaXMgZ2VuZXJhbCBpbnRlcmVzdCBpbiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBjb25jZXB0dWFsIHVuaXRzLCBhcyB3ZWxsIGFzIHRoZSBzcGVjaWZpYyBpbnR1aXRpb24gYWJvdXQgaG93IHRvIGRldGVjdCB0aGUga2luZHMgb2YgYXN5bW1ldHJpZXMgdGhhdCB3b3VsZCBiZSB0aGUgc2lnbmF0dXJlIG9mIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzLCBpbnRvIGEgc3BlY2lmaWMgYW5hbHlzaXMgcGxhbiB0byBiZSBhcHBsaWVkIHRvIGVhY2ggb2YgdGhlc2UgZGF0YXNldHMgaW4gdHVybi4gCgojIyBEZXRhaWxzIG9mIGFuYWx5c2VzCgpVbmxpa2UgdGhlIHByZXZpb3VzIGNoYXB0ZXIsIGluIHdoaWNoIEkgZW1wbG95ZWQgYSBjYW5vbmljYWwgYXBwcm9hY2ggdG8gaWRlbnRpZnlpbmcgbGF0ZW50IGNvbnN0cnVjdHMgdGhyb3VnaCBhbmFseXNlcyBvZiBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVz4oCUZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEp4oCUaW4gdGhpcyBjaGFwdGVyIHRoZXJlIGlzIG5vIHRyaWVkLWFuZC10cnVlIG1ldGhvZCBmb3IgbWVldGluZyBteSBhbmFseXNpcyBnb2Fscy4gSW5zdGVhZCwgSSBjaGFydCBteSBvd24gY291cnNlIHRocm91Z2ggdGhlc2UgZGF0YXNldHMsIHVzaW5nIHRoZSBFRkEgc29sdXRpb25zIHJlcG9ydGVkIGluIENoYXB0ZXIgSUkgdG8gc2NvcmUgcGFydGljaXBhbnRzJyBlbmRvcnNlbWVudHMgb2YgZWFjaCBjb25jZXB0dWFsIHVuaXQgZm9yIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXIocykgdGhhdCB0aGV5IGFzc2Vzc2VkLCBleGFtaW5pbmcgaG9saXN0aWMgdmlzdWFsaXphdGlvbnMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlc2UgZW5kb3JzZW1lbnRzLCBhbmQgdGhlbiBjb25kdWN0aW5nIG1vcmUgdGFyZ2V0ZWQgcmVncmVzc2lvbiBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMgYXMgb25lIGluZGV4IG9mIGFzeW1tZXRyaWNhbCAoYW5kIHBvc3NpYmx5IGhpZXJhcmNoaWNhbCkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMuCgojIyMgU2NvcmluZyBlbmRvcnNlbWVudHMgb2YgY29uY2VwdHVhbCB1bml0cwoKVGhlIGZpcnN0IHN0ZXAgaW4gdGhlc2UgYW5hbHlzZXMgaXMgdG8gdHJhbnNmb3JtIHBhcnRpY2lwYW50cycgcmF0aW5ncyBvZiBpbmRpdmlkdWFsIG1lbnRhbCBjYXBhY2l0aWVzIGludG8gInNjb3JlcyIgdGhhdCBpbmRpY2F0ZSB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoZXkgZW5kb3JzZWQgYSBwYXJ0aWN1bGFyIGNvbmNlcHR1YWwgdW5pdCBmb3IgdGhlIHRhcmdldCBjaGFyYWN0ZXIocykgdGhhdCB0aGV5IHdlcmUgYXNzaWduZWQgdG8gYXNzZXNzLiBUbyBkbyB0aGlzLCBJIG1ha2UgdXNlIG9mIHRoZSBFRkFzIHByZXNlbnRlZCBpbiBDaGFwdGVyIElJSeKAlHdoaWNoIG9yaWdpbmFsbHkgc2VydmVkIHRvIGlkZW50aWZ5IGEgc2V0IG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gYSBwYXJ0aWN1bGFyIHNhbXBsZeKAlHRvIGEgbmV3IGVuZDogdGhlIGNvbnN0cnVjdGlvbiBvZiAic2NhbGVzIiBmb3IgZWFjaCBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzLiBTY2FsZSBjb25zdHJ1Y3Rpb24gaXMgYSBjb21tb24gdXNlIG9mIEVGQSBhbmQgc2ltaWxhciBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gYW5hbHlzZXMgKGlmIGFueXRoaW5nLCBtb3JlIGNvbW1vbiB0aGFuIHVzaW5nIEVGQSB0byBtYWtlIHRoZSBraW5kcyBvZiB0aGVvcmV0aWNhbCBhcmd1bWVudHMgZmVhdHVyZWQgaW4gQ2hhcHRlciBJSSkuCgpGb3IgZWFjaCBFRkEgc29sdXRpb24sIEkgY29uc3RydWN0IGEgc2NhbGUgZm9yIGVhY2ggb2YgdGhlIGZhY3RvcnMgKGNvbmNlcHR1YWwgdW5pdHMpIGlkZW50aWZpZWQgYnkgdGhhdCBzb2x1dGlvbi4gRmlyc3QsIEkgc29ydCBlYWNoIG9mIHRoZSBtZW50YWwgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiB0aGF0IHN0dWR5IGludG8gY2F0ZWdvcmllcyBiYXNlZCBvbiB0aGVpciBsb2FkaW5ncyBvbiBlYWNoIG9mIHRoZSBmYWN0b3JzIGluIHRoYXQgc29sdXRpb24uIEZvciBlYWNoIG1lbnRhbCBjYXBhY2l0eSwgSSBpZGVudGlmeSB0aGUgImRvbWluYW50IiBmYWN0b3IgYXMgdGhlIGZhY3RvciB3aXRoIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGZhY3RvciBsb2FkaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1lbnRhbCBjYXBhY2l0eSBfZmVlbCBoYXBweV8gaGFkIGxvYWRpbmdzIG9mIDAuNjAgb24gdGhlIEJPRFkgZmFjdG9yLCAwLjcwIG9uIHRoZSBIRUFSVCBmYWN0b3IsIGFuZCAwLjMwIG9uIHRoZSBNSU5EIGZhY3RvciwgSSB3b3VsZCBzb3J0IGl0IGludG8gdGhlIEhFQVJUIGNhdGVnb3J5LiBGb3IgZWFjaCBmYWN0b3IsIEkgdGFrZSB0aGUgc2l4IGhpZ2hlc3QtbG9hZGluZyBpdGVtcyBhcyBhIGNhbmRpZGF0ZSBzY2FsZSwgdGhlbiAiZHJvcCIgdGhlIGNhcGFjaXRpZXMgd2l0aCB0aGUgc21hbGxlc3QgZmFjdG9yIGxvYWRpbmdzIG9uIHRoZWlyIHJlc3BlY3RpdmUgZG9taW5hbnQgZmFjdG9ycyB1bnRpbCBJIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGluIGVhY2ggY2F0ZWdvcnkuIEZvciBleGFtcGxlLCBpZiB0aGUgQk9EWSBmYWN0b3Igd2VyZSB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBuaW5lIG1lbnRhbCBjYXBhY2l0aWVzLCB0aGUgSEVBUlQgZmFjdG9yIGZvciBzaXggY2FwYWNpdGllcywgYW5kIHRoZSBNSU5EIGZhY3RvciBmb3IgZml2ZSBjYXBhY2l0aWVzLCBmb3IgZWFjaCBmYWN0b3IgSSB3b3VsZCBrZWVwIG9ubHkgdGhlIGNhcGFjaXRpZXMgd2l0aCB0aGUgZml2ZSBoaWdoZXN0IHBvc2l0aXZlIGxvYWRpbmdzIG9uIHRoYXQgZmFjdG9yLCBpbiBvcmRlciB0byBjb25zdHJ1Y3QgdGhyZWUgc2NhbGVzIG9mIGVxdWFsIGxlbmd0aCAoYW5kIGEgbWF4aW11bSBsZW5ndGggb2Ygc2l4IGl0ZW1zKS4KClRvIGNhbGN1bGF0ZSBzY29yZXMgb24gdGhlc2Ugc2NhbGVzLCBJIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgYWxsIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBlYWNoIHNjYWxlLCByZXNjYWxpbmcgc2NvcmVzIHRvIHJhbmdlIGZyb20gMCB0byAxIHRvIGZhY2lsaXRhdGUgY29tcGFyaXNvbiBhY3Jvc3Mgc3R1ZGllcy4gVGhpcyB5aWVsZHMgYSBkYXRhc2V0IGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgaXMgYXNzb2NpYXRlZCB3aXRoIG9uZSBzY29yZSAoYmV0d2VlbiAwIGFuZCAxKSBmb3IgZWFjaCBvZiB0aGUgY29uY2VwdHVhbCB1bml0cyBpZGVudGlmaWVkIGluIHRoZSByZWxhdGl2ZSBFRkEgc29sdXRpb24sIGZvciBlYWNoIG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVycyB0aGF0IHRoYXQgcGFydGljaXBhbnQgYXNzZXNzZWQuCgpJbiB0aGlzIGNoYXB0ZXIsIEkgYXBwbHkgdGhpcyBtZXRob2QgdG8gYWxsIG9mIHRoZSB0aHJlZS1mYWN0b3Igc29sdXRpb25zIGZvciBhZHVsdCBzYW1wbGVzIGFzIHByZXNlbnRlZCBpbiBDaGFwdGVyIElJSSAoU3R1ZGllcyAxLTQpLCB5aWVsZGluZyBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NvcmVzIGZvciBlYWNoIHRhcmdldCBjaGFyYWN0ZXIgYXMgYXNzZXNzZWQgYnkgZWFjaCBwYXJ0aWNpcGFudC4gKEkgaWdub3JlIHRoZSBhYmVycmFudCBmb3VyLWZhY3RvciBzb2x1dGlvbiBmb3IgYWR1bHRzIGluIFN0dWR5IDIgc3VnZ2VzdGVkIGJ5IG9uZSBvZiB0aGUgdGhyZWUgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMgY29uc2lkZXJlZCBpbiB0aGF0IGNoYXB0ZXIsIHNpbmNlIHRoaXMgd2FzIHRoZSBvbmx5IHN0dWR5IG91dCBvZiB0aGUgc2V2ZW4gY29uc2lkZXJlZCBpbiB3aGljaCBhIGZvdXItZmFjdG9yIHNvbHV0aW9uIGFwcGVhcmVkIHRvIGFkZCBhbnkgdmFsdWUgYmV5b25kIHRoZSByb2J1c3QgQk9EWS1IRUFSVC1NSU5EIGZyYW1ld29yayBjb21tb24gdG8gYWxsIHN0dWRpZXMuIFtYWCBBUFBFTkRJWCBCP10pIAoKSSB1c2UgdGhlc2UgdGhyZWUtZmFjdG9yIGFkdWx0IHNvbHV0aW9ucyB0byBhc3Nlc3MgZGF0YXNldHMgZnJvbSBib3RoIGFkdWx0cyBhbmQgY2hpbGRyZW4sIGFsbG93aW5nIG1lIHRvIGV4cGxvcmUgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgYSAibWF0dXJlIiBzZXQgb2YgY29uY2VwdHVhbCB1bml0cyAob24gdGhlIGFzc3VtcHRpb24gdGhhdCwgb3ZlciBkZXZlbG9wbWVudCwgY2hpbGRyZW4gd2lsbCB1bHRpbWF0ZWx5IGNvbWUgdG8gYSBjb25zZW5zdXMgd2l0aCB0aGUgYWR1bHRzIGluIHRoZWlyIGN1bHR1cmFsIGNvbnRleHQpLgoKRm9yIHRoZSBmaXJzdCBzYW1wbGUgb2YgIm9sZGVyIiBjaGlsZHJlbiAoNy05eSBvZiBhZ2UsIFN0dWR5IDIpLCBJIGFsc28gYnJpZWZseSBjb25zaWRlciBhIHNlY29uZCBzZXQgb2YgY29uY2VwdHVhbCB1bml0czogQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGFzIGRlZmluZWQgYnkgRUZBcyBvZiB0aGUgY2hpbGRyZW4ncyBvd24gcmVzcG9uc2VzIChyYXRoZXIgdGhhbiBhZHVsdHMnIHJlc3BvbnNlcykuIEJlY2F1c2UgdGhlIEVGQXMgZm9yIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMgYXJlIHNvIHNpbWlsYXIgKHNlZSBDaGFwdGVyIElJIGFuZCBUYWJsZSA0LjEwKSwgdGhlIG91dGNvbWVzIG9mIHRoZXNlIHR3byBhcHByb2FjaGVzIHRvIGNvbnN0cnVjdGluZyBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIHRvIHlpZWxkIHZlcnkgc2ltaWxhciByZXN1bHRzIGluIHRoaXMgYWdlIGdyb3VwLiAoSW5kZWVkLCBmb3IgdGhlIHNlY29uZCBzYW1wbGUgb2YgIm9sZGVyIiBjaGlsZHJlbiwgU3R1ZHkgMywgdGhlIHNjYWxlcyB0aGF0IHdvdWxkIGVtZXJnZSBmcm9tIEVGQSBvZiB0aGVpciByZXNwb25zZXMgYXJlIGlkZW50aWNhbCB0byB0aGUgc2NhbGVzIHRoYXQgZW1lcmdlIGZyb20gRUZBIG9mIGFkdWx0IHJlc3BvbnNlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGEgc2luZ2xlIGl0ZW0gb24gdGhlIF9CT0RZXyBzY2FsZTsgc2VlIFRhYmxlIDQuMTAuKQoKRm9yICJ5b3VuZ2VyIiBjaGlsZHJlbiAoNC02eSBvZiBhZ2UsIFN0dWR5IDM7IDQtNXkgb2YgYWdlLCBTdHVkeSA0KSwgSSBoYXZlIGNob3NlbiBfbm90XyB0byBleGFtaW5lIHRoZSB2YXJpb3VzIHNldHMgb2YgdHdvIHRvIGZvdXIgY29uY2VwdHVhbCB1bml0cyB0aGF0IHdvdWxkIGJlIGRlZmluZWQgYnkgRUZBcyBvZiBjaGlsZHJlbidzIG93biByZXNwb25zZXMuICBBcyBkaXNjdXNzZWVkIGF0IGxlbmd0aCBpbiBDaGFwdGVyIElJLCBFRkFzIG9mIHlvdW5nZXIgY2hpbGRyZW4ncyByZXNwb25zZXMgd2VyZSBsZXNzIHJvYnVzdCBhbmQgcmVsaWFibGUgdGhhbiB0aG9zZSBvZiBvbGRlciBjaGlsZHJlbiBvciBhZHVsdHMsIHdpdGggZGlmZmVyZW50IGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzIGdlbmVyYXRpbmcgZGlmZmVyZW50IEVGQSBzb2x1dGlvbnMuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIGN1cnJlbnQgY2hhcHRlciwgdGhpcyB3b3VsZCBtZWFuIGFzc2Vzc2luZyBtdWx0aXBsZSBhZGRpdGlvbmFsIHNldHMgb2YgY29uY2VwdHVhbCB1bml0cyBmb3IgZWFjaCBvZiB0aGVzZSBzYW1wbGVzLiBJIGhhdmUgY2hvc2VuIHRvIHByaW9yaXRpemUgY29tcGFyYWJpbGl0eSBhY3Jvc3Mgc2FtcGxlcyBhbmQgc3R1ZGllcyBvdmVyIGNvbXBsZXRlbmVzcyBpbiB0aGUgbWFpbiB0ZXh0IG9mIHRoaXMgY2hhcHRlcjsgdGhlIGludGVyZXN0ZWQgcmVhZGVyIGNhbiBmaW5kIHRoZXNlIGFsdGVybmF0aXZlIGFuYWx5c2VzIGluIEFwcGVuZGl4IEIgW1hYIERPIEkgV0FOVCBUTyBETyBUSElTP10uIAoKSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGlzIGlzIGZhciBmcm9tIHRoZSBvbmx5IHdheSB0byBhcHByb2FjaCAic2NvcmluZyIgcGFydGljaXBhbnRzIG9uIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMuIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyBzY2FsZXMgdG8gY2FwdHVyZSBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgSSBjb3VsZCBoYXZlIGV4YW1pbmVkIGZhY3RvciBzY29yZXPigJRzdW1tYXJpZXMgb2YgZWFjaCBmYWN0b3IgKGNvbmNlcHR1YWwgdW5pdCkgYmFzZWQgb24gYSBwYXJ0aWNpcGFudCdzIHJlc3BvbnNlcyB0byBhbGwgbWVudGFsIGNhcGFjaXRpZXMgYW5kIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gYWxsIG1lbnRhbCBjYXBhY2l0aWVzIGFuZCBhbGwgZmFjdG9ycyBpbmNsdWRlZCBpbiB0aGF0IEVGQSBzb2x1dGlvbi4gSG93ZXZlciwgbXVjaCBsaWtlIF96Xy1zY29yZXMsIGZhY3RvciBzY29yZXMgaW5kaWNhdGUgd2hlcmUgYSBwYXJ0aWNpcGFudCBmYWxscyBpbiByZWxhdGlvbiB0byBvdGhlciBwYXJ0aWNpcGFudHMgaW4gdGhlIHNhbXBsZSwgYW5kIGRvIG5vdCBwcm92aWRlIHRoZSBraW5kIG9mIGFic29sdXRlIHNjb3JlIHRoYXQgaXMga2V5IHRvIG15IGdvYWwgaW4gdGhpcyBjaGFwdGVyLCB3aGljaCBpcyB0byBhbmFseXplIHJlbGF0aW9uc2hpcHMgYW1vbmcgZmFjdG9ycyBpbiB0ZXJtcyBvZiB0aGUgZXh0ZW50IHRvIHdoaWNoIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGluZGljYXRlZCB0aGF0IHRhcmdldCBjaGFyYWN0ZXJzICJwb3NzZXNzZWQiIHRoZSBjb25jZXB0dWFsIHVuaXRzIEJPRFksIEhFQVJULCBhbmQgTUlORCwgYW5kIHRvIGNvbXBhcmUgdGhlc2Ugc2NvcmVzIGFjcm9zcyBzYW1wbGVzIGFuZCBzdHVkaWVzIChyYXRoZXIgdGhhbiBvbmx5IGFjcm9zcyBwYXJ0aWNpcGFudHMgd2l0aGluIGEgc2FtcGxlKS4gW1hYIEFQUEVORElYIEI/XQoKRXZlbiB3aXRoaW4gdGhlICJzY2FsZSIgYXBwcm9hY2ggZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiwgdGhlcmUgYXJlIG1hbnkgcGFyYW1ldGVycyBvZiB0aGlzIGFuYWx5c2lzIHRoYXQgSSBjb3VsZCBoYXZlIHNldCBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsIEkgY291bGQgaGF2ZSBjb25zaWRlcmVkIGFic29sdXRlIGZhY3RvciBsb2FkaW5ncyByYXRoZXIgdGhhbiByYXcgZmFjdG9yIGxvYWRpbmdzLCB3aGljaCB3b3VsZCBhbGxvdyBmb3IgbWVudGFsIGNhcGFjaXRpZXMgdGhhdCBsb2FkZWQgZXNwZWNpYWxseSBzdHJvbmdseSBfbmVnYXRpdmVseV8gb24gYSBwYXJ0aWN1bGFyIGZhY3RvciB0byBjb250cmlidXRlIChuZWdhdGl2ZWx5KSB0byBzY29yZXMgb24gdGhhdCBjb25jZXB0dWFsIHVuaXQ7IEkgY291bGQgaGF2ZSBvbWl0dGVkIHRoZSBzdGVwIG9mIG1ha2luZyB0aGUgc2NhbGVzIGZvciBhbGwgZmFjdG9ycyB3aXRoaW4gYSBzaW5nbGUgRUZBIHNvbHV0aW9uIGVxdWFsIGxlbmd0aDsgSSBjb3VsZCBoYXZlIGNob3NlbiB0byB1c2Ugb25seSB0aGUgdG9wIGZvdXIgb3IgZml2ZSAocmF0aGVyIHRoYW4gc2l4KSBtZW50YWwgY2FwYWNpdGllcyBhY3Jvc3MgYWxsIEVGQSBzb2x1dGlvbnMsIG9yIHRvIHNldCBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2NhbGU7IG9yIEkgY291bGQgaGF2ZSBpbXBsZW1lbnRlZCBhYnNvbHV0ZSB0aHJlc2hvbGRzIGZvciBob3cgc3Ryb25nbHkgYSBtZW50YWwgY2FwYWNpdHkgbXVzdCBsb2FkIG9uIGEgZmFjdG9yIGluIG9yZGVyIHRvIGNvdW50IHRvd2FyZCB0aGUgc2NvcmUgZm9yIHRoYXQgY29uY2VwdHVhbCB1bml0LCBvciBhYnNvbHV0ZSBsaW1pdHMgb24gdGhlIGRlZ3JlZSB0byB3aGljaCBhIG1lbnRhbCBjYXBhY2l0eSBjYW4gImNyb3NzLWxvYWQiIG9uIG5vbi1kb21pbmFudCBmYWN0b3JzIGFuZCBzdGlsbCBjb3VudCB0b3dhcmQgdGhlIHNjb3JlIGZvciBhbnkgb25lIGNvbmNlcHR1YWwgdW5pdC4gW1hYIEFQUEVORElYIEI/XSBIb3dldmVyLCB0aGVzZSBraW5kcyBvZiBkZXRhaWxzIGRpZmZlciBxdWl0ZSBkcmFtYXRpY2FsbHkgYWNyb3NzIHN0dWRpZXMgYW5kIGFnZSBncm91cHMuIEZvciBleGFtcGxlLCBpbiBzb21lIHNhbXBsZXMgdGhlcmUgYXJlIG5vIHN0cm9uZyBuZWdhdGl2ZSBmYWN0b3IgbG9hZGluZ3MsIGFuZCBpbiBvdGhlcnMgdGhlcmUgYXJlOyBpZiBJIGNvbnNpZGVyZWQgYWJzb2x1dGUgbG9hZGluZ3MgcmF0aGVyIHRoYW4gcmF3IGxvYWRpbmdzLCBJIGNvdWxkIGVuZCB1cCBjb21wYXJpbmcgc2NvcmVzIGZyb20gYSAiYmlwb2xhciIgc2NhbGUgaW4gb25lIHNhbXBsZSB0byBzY29yZXMgZnJvbSBhICJ1bmlwb2xhciIgc2NhbGUgaW4gYW5vdGhlciBzYW1wbGUsIG1ha2luZyB0aGUgY29tcGFyaXNvbiBtb3JlIGRpZmZpY3VsdCB0byBpbnRlcnByZXQuIExpa2V3aXNlLCBzb21lIEVGQSBzb2x1dGlvbnMgdGVuZGVkIHRvIGZlYXR1cmUgZ2VuZXJhbGx5IHdlYWtlciBmYWN0b3IgbG9hZGluZ3MgdGhhbiBvdGhlcnM7IGlmIEkgd2VyZSB0byBpbXBvc2UgYWJzb2x1dGUgdGhyZXNob2xkcyBmb3IgdGhlIHN0cmVuZ3RoIG9mIGZhY3RvciBsb2FkaW5ncywgSSBjb3VsZCBlbmQgdXAgY29tcGFyaW5nIHNjb3JlcyBmcm9tIHNjYWxlcyBvZiB3aWxkbHkgZGlmZmVyZW50IGxlbmd0aHMgYWNyb3NzIHNhbXBsZXMuIEluIG15IHZpZXcsIHRoZSBhbmFseXNpcyBkZWNpc2lvbnMgb3V0bGluZWQgYWJvdmUgbWF4aW1pemUgY29tcGFyYWJpbGl0eSBhY3Jvc3Mgc3R1ZGllcyBhbmQgYWdlIGdyb3Vwc+KAlHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhpcyBjaGFwdGVyLiAoTm90ZSwgaG93ZXZlciwgdGhhdCBpbiB0aGUgYW5hbHlzaXMgY29kZSBmb3IgdGhpcyBjaGFwdGVyIEkgaGF2ZSBpbmNsdWRlZCBlYXN5IHNob3J0IGN1dHMgZm9yIHRoZSBpbnRlcmVzdGVkIHJlYWRlciB0byBleHBsb3JlIGRpZmZlcmVudCBvcHRpb25zIGZvciBlYWNoIG9mIHRoZXNlIHBhcmFtZXRlcnMuKQoKYGBge3J9CiMgc2VlICIuL3NjcmlwdHMvb3JnX3BhcmFtLlIiIGZvciBwYXJhbWV0ZXIgc2V0dGluZwpgYGAKCiMjIyBWaXN1YWxpemluZyByZWxhdGlvbnNoaXBzCgpBZnRlciBjb25zdHJ1Y3Rpbmcgc2NhbGVzIHRvIGNhcHR1cmUgcGFydGljaXBhbnRzJyBlbmRvcnNlbWVudCBvZiBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgbXkgbmV4dCBzdGVwIGlzIHRvIGNoYXJhY3Rlcml6ZSB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBzY29yZXMgb24gdGhlc2UgdGhyZWUgc2NhbGVzIChfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8pLiBUaGlzIGlzIGEgdHJ1bHkgZXhwbG9yYXRvcnkgZW5kZWF2b3I6IEF0IHRoZSBvdXRzZXQgb2YgdGhpcyB3b3JrLCBJIGhhZCBubyBzdHJvbmcgaHlwb3RoZXNlcyBhYm91dCB0aGVzZSByZWxhdGlvbnNoaXBzLCBhbmQgb25seSBoaWdoLWxldmVsIGludHVpdGlvbnMgYWJvdXQgd2hpY2ggYXNwZWN0cyBvZiB0aGVzZSByZWxhdGlvbnNoaXBzIHdvdWxkIGJlIG9mIGdyZWF0ZXN0IGludGVyZXN0IGluIHVuZGVyc3RhbmRpbmcgdGhlIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIGludGVyZXN0LiBBY2NvcmRpbmdseSwgSSBiZWdpbiBlYWNoIHNlY3Rpb24gd2l0aCBhIGhvbGlzdGljIHZpc3VhbGl6YXRpb24gb2YgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgdGhyZWUgcGFpcnMgb2YgY29uY2VwdHVhbCB1bml0cywgcHJlc2VudGluZyBzY2F0dGVycGxvdHMgb2YgcGFydGljaXBhbnRzJyBzY29yZXMgb24gZWFjaCBwYWlyIG9mIHNjYWxlcyAoX0JPRFlfIHZzLiBfSEVBUlRfLCBfQk9EWV8gdnMuIF9NSU5EXywgYW5kIF9IRUFSVF8gdnMuIF9NSU5EXykgYW5kIG9mZmVyaW5nIGluZm9ybWFsIGRlc2NyaXB0aW9ucyBvZiB3aGF0IEkgY29uc2lkZXIgdG8gYmUgdGhlIG1vc3Qgc3RyaWtpbmcgZmVhdHVyZXMgb2YgdGhlc2Ugc2NhdHRlcnBsb3RzLiBJbiBhZGRpdGlvbiB0byBtb3RpdmF0aW5nIG15IHN1YnNlcXVlbnQgZm9ybWFsIGFuYWx5c2VzLCB0aGVzZSBpbmZvcm1hbCBkZXNjcmlwdGlvbnMgYXJlIGludGVuZGVkIHRvIGd1aWRlIGZ1dHVyZSByZXNlYXJjaCB0YXJnZXRpbmcgYWRkaXRpb25hbCBhc3BlY3RzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMgdGhhdCBhcmUgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhlIGN1cnJlbnQgZGlzc2VydGF0aW9uLgoKIyMjIEZvcm1hbCBhbmFseXNlcyBvZiBhc3ltbWV0cmllcwoKQXMgSSBkZXNjcmliZWQgaW4gdGhlIHRoZW9yZXRpY2FsIG92ZXJ2aWV3IG9mIHRoaXMgZGlzc2VydGF0aW9uIChDaGFwdGVyIEkgW1hYIENIRUNLIFRISVMgSVMgVFJVRV0pIGFuZCB0aGUgb3BlbmluZyBvZiB0aGlzIGNoYXB0ZXIsIG9uZSBhc3BlY3Qgb2YgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY29uY2VwdHVhbCB1bml0cyB0aGF0IGlzIG9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgdG8gbWUgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIGFzeW1tZXRyaWVzIGluIHRoZXNlIHJlbGF0aW9uc2hpcHMuIFdlcmUgcGFydGljaXBhbnRzIG1vcmUgbGlrZWx5IHRvIGF0dHJpYnV0ZSBCT0RZIHdpdGhvdXQgSEVBUlQsIG9yIEhFQVJUIHdpdGhvdXQgQk9EWT8gV2hhdCBhYm91dCBCT0RZIHZzLiBNSU5ELCBvciBIRUFSVCB2cy4gTUlORD8gU3VjaCBhc3ltbWV0cmllcyBtaWdodCByZXZlYWwgd2hpY2ggY29uY2VwdHVhbCB1bml0cyBhcmUgbW9yZSBiYXNpYyBvciBmdW5kYW1lbnRhbCwgd2hldGhlciBhbnkgb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cyBtaWdodCBiZSBjb25zaWRlcmVkIHRvIGRlcGVuZCBvbiB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXJz4oCUaW4gb3RoZXIgd29yZHMsIHdoZXRoZXIgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgKGluIGFueSBwYXJ0aWN1bGFyIHNhbXBsZSkgbWlnaHQgYmUgY2hhcmFjdGVyaXplZCBieSBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgYW1vbmcgY29uY2VwdHVhbCB1bml0cy4gTGlrZXdpc2UsIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2VzIGluIHRoZSBkaXJlY3Rpb24gb3Igc3RyZW5ndGggb2YgdGhlc2UgYXN5bW1ldHJpZXMgbWlnaHQgaGludCBhdCBkZXZlbG9wbWVudGFsIGNoYW5nZXMgaW4gdGhlc2UgaGllcmFyY2hpY2FsIHN0cnVjdHVyZXMgb3ZlciBlYXJseSBhbmQgbWlkZGxlIGNoaWxkaG9vZC4KCkd1aWRlZCBieSB0aGlzIHRoZW9yZXRpY2FsIGludGVyZXN0LCB0aGUgbGFzdCBzdGVwIGluIG15IGFuYWx5c2VzIGluIHRoaXMgY2hhcHRlciBpcyB0byBleGFtaW5lIGRpZmZlcmVuY2VzIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzLiBGb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGUuZy4sIEJPRFkgdnMuIEhFQVJUKSwgSSBjYWxjdWxhdGUgYSBzaW1wbGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNjb3JlcyBvbiB0aGVzZSB0d28gc2NhbGVzIChpbiB0aGlzIGNhc2UsIHN1YnRyYWN0aW5nIHBhcnRpY2lwYW50cycgX0hFQVJUXyBzY29yZXMgZnJvbSB0aGVpciBfQk9EWV8gc2NvcmVzKS4gSW4gdGhlIHZpc3VhbGl6YXRpb25zIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgcGVycGVuZGljdWxhciBkaXN0YW5jZSBiZXR3ZWVuIGEgcGFydGljdWxhciBkYXRhcG9pbnQgYW5kIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkKS4gKFRoZSBkaXJlY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgY2hvc2VuIGFyYml0cmFyaWx5OyBlLmcuLCBJIGNvdWxkIGhhdmUgY2hvc2VuIHRvIHN1YnRyYWN0IHBhcnRpY2lwYW50cycgX0JPRFlfIHNjb3JlcyBmcm9tIHRoZWlyIF9IRUFSVF8gc2NvcmVzLikKCkhlcmUgSSBkZXNjcmliZSBteSBwcmluY2lwbGVzIGZvciBpbnRlcnByZXRpbmcgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMuIEEgc3VtbWFyeSBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgYWxsIHNhbXBsZXMgYW5kIHN0dWRpZXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyIChGaWd1cmUgNC4xMCwgcGFuZWwgQSkuCgpJbiBteSB2aWV3LCBkaWZmZXJlbmNlIHNjb3JlcyBjbG9zZSB0byB6ZXJvIHByb3ZpZGUgbm8gZXZpZGVuY2UgZm9yIG9yIGFnYWluc3QgYSBoaWVyYXJjaGljYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cy4gVGhpcyBpcyBpbGx1c3RyYXRlZCBtb3N0IGRyYW1hdGljYWxseSBieSB0aGUgZmFjdCB0aGF0IGEgZGlmZmVyZW5jZSBzY29yZSBvZiB6ZXJvIGNvdWxkIG9jY3VyIGlmIGEgcGFydGljaXBhbnQgYXR0cmlidXRlcyB2ZXJ5IGxpdHRsZSBpbiB0aGUgd2F5IG9mIG1lbnRhbCBsaWZlIHRvIGEgcGFydGljdWxhciB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCBhbiBpbmVydCBvYmplY3QpIG9yIGlmIGEgcGFydGljaXBhbnQgYXR0cmlidXRlcyBtYXhpbWFsIG1lbnRhbCBsaWZlIHRvIGEgcGFydGljdWxhciB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCBhbiBhZHVsdCBodW1hbinigJRpbiBlaXRoZXIgY2FzZSwgdGhpcyB3b3VsZCB5aWVsZCBkaWZmZXJlbmNlIHNjb3JlcyBvZiB6ZXJvIGZvciBhbnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLiBFdmVuIGlmIGEgcGFydGljaXBhbnQgZW5kb3JzZXMgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gYSBtaWRkbGluZyBkZWdyZWUgKGUuZy4sIGluZGljYXRpbmcgdGhhdCBhIGJlZXRsZSBoYXMgbWlkZGxpbmcgY2FwYWNpdGllcyBpbiBib3RoIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBkb21haW5zKSwgSSB3b3VsZCBub3QgY29uc2lkZXIgdGhpcyBldmlkZW5jZSBhZ2FpbnN0IGEgcG9zc2libGUgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uLgoKTWVhbndoaWxlLCBpZiBwYXJ0aWNpcGFudHMgd2l0aGluIGEgc2FtcGxlIGhhdmUgcmFkaWNhbGx5IGRpdmVyZ2VudCBkaWZmZXJlbmNlIHNjb3Jlc+KAlGUuZy4sIGlmIHJvdWdobHkgaGFsZiBvZiBwYXJ0aWNpcGFudHMgaGF2ZSBtdWNoIGhpZ2hlciBfSEVBUlRfIHRoYW4gX01JTkRfIHNjb3JlcyBhbmQgcm91Z2hseSBoYWxmIGhhdmUgbXVjaCBsb3dlciBfSEVBUlRfIHRoYW4gX01JTkRfIHNjb3Jlc+KAlEkgaW50ZXJwcmV0IHRoaXMgYXMgc29tZSBldmlkZW5jZSBfYWdhaW5zdF8gc3lzdGVtYXRpYyBoaWVyYXJjaGljYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uLiAKCkl0IGlzIG9ubHkgYW4gYWJ1bmRhbmNlIG9mIG5vbi16ZXJvIGRpZmZlcmVuY2Ugc2NvcmVzIHJ1bm5pbmcgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGZvciBtYW55IHBhcnRpY2lwYW50cyB3aXRoaW4gYSBzYW1wbGUgdGhhdCwgaW4gbXkgdmlldywgcHJvdmlkZXMgZXZpZGVuY2UgX2Zvcl8gc3lzdGVtYXRpYyBoaWVyYXJjaGllcyBhbW9uZyB0aGUgY29uY2VwdHVhbCB1bml0cy4gVGhpcyBkZWdyZWUgb2YgY29uc2Vuc3VzIGFjcm9zcyBwYXJ0aWNpcGFudHMgaW4gdGhlIGRpcmVjdGlvbiBvZiBhc3ltbWV0cnkgYmV0d2VlbiBlbmRvcnNlbWVudHMgb2YgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaXMgcGFydGljdWxhcmx5IHNpZ25pZmljYW50IGluIHRoZXNlIGRhdGFzZXRzIGJlY2F1c2UgdGhlc2Ugc3R1ZGllcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBlbGljaXRpbmcgX3ZhcmlhYmlsaXR5XyBpbiBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGFjcm9zcyBwYXJ0aWNpcGFudHPigJRlaXRoZXIgYnkgYXNraW5nIHBhcnRpY2lwYW50cyBhYm91dCAiZWRnZSBjYXNlcyIgKGEgYmVldGxlLCBhIHJvYm90KSwgd2hvc2UgcGFydGljdWxhciBtZW50YWwgY2FwYWNpdHkgcHJvZmlsZXMgYXJlIGxpa2VseSB0byBiZSB0aGUgc3ViamVjdCBvZiBkaXNhZ3JlZW1lbnQgYWNyb3NzIGluZGl2aWR1YWxzOyBvciBieSBhc2tpbmcgZGlmZmVyZW50IHBhcnRpY2lwYW50cyB0byBjb25zaWRlciBhIHZhcmlldHkgb2YgImRpdmVyc2UgY2hhcmFjdGVycyIgKGluY2x1ZGluZyBpbmVydCBvYmplY3RzLCB0ZWNobm9sb2dpZXMsIGFuZCBhIHdpZGUgcmFuZ2Ugb2YgYW5pbWFscyBhbmQgaHVtYW5zKSwgd2hvc2UgbWVudGFsIGNhcGFjaXR5IHByb2ZpbGVzIGFyZSBsaWtlbHkgY29uc2lkZXJlZCB0byB2YXJ5IGRyYW1hdGljYWxseS4gKFNlZSBDaGFwdGVyIElJIGZvciBmdXJ0aGVyIGRpc2N1c3Npb24gb2YgdGhlc2UgdHdvIHZhcmlhbnRzIG9mIHRoZSBleHBlcmltZW50YWwgYXBwcm9hY2guKSBEaWZmZXJlbmNlcyBpbiBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cycga25vd2xlZGdlLCBleHBlcmllbmNlLCBhbmQgb3BpbmlvbnMsIGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgYXNzZXNzZWQgYnkgZGlmZmVyZW50IHBhcnRpY2lwYW50cywgd2VyZSBrZXkgZmVhdHVyZXMgb2YgdGhlIGRlc2lnbiBvZiB0aGVzZSBzdHVkaWVzOyBpdCB3YXMgY3JpdGljYWwgdG8gdGhlIHN1Y2Nlc3Mgb2YgdGhlIEVGQXMgcHJlc2VudGVkIGluIENoYXB0ZXIgSUlJIHRoYXQgcGFydGljaXBhbnRzIHZhcmllZCBpbiB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZXkgZW5kb3JzZWQgcGFydGljdWxhciBtZW50YWwgY2FwYWNpdGllcy4gSWYsIGRlc3BpdGUgdGhpcyB2YXJpYWJpbGl0eSwgcGFydGljaXBhbnRzIG5vbmV0aGVsZXNzIGNvbnZlcmdlIG9uIGEgc2FtZSBwYXR0ZXJuIG9mIF9yZWxhdGl2ZV8gZW5kb3JzZW1lbnRzIGFjcm9zcyB0d28gY29uY2VwdHVhbCB1bml0c+KAlGUuZy4sIGlmIG1vc3QgcGFydGljaXBhbnRzIGVuZG9yc2UgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIG1vcmUgc3Ryb25nbHkgdGhhbiB0aGV5IGVuZG9yc2UgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiB0aGUgX0hFQVJUXyBzY2FsZSwgcmVnYXJkbGVzcyBvZiB0aGUgYWJzb2x1dGUgc3RyZW5ndGggb2YgdGhlc2UgZW5kb3JzZW1lbnRz4oCUdGhpcyBwcm92aWRlcyBzb21lIGV2aWRlbmNlIG9mIGEgY29tbW9uIGNvbmNlcHR1YWwgZnJhbWV3b3JrIHRoYXQgcGxhY2VzIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgaW4gYXN5bW1ldHJpY2FsLCBwZXJoYXBzIGhpZXJhcmNoaWNhbCwgcmVsYXRpb24gdG8gb25lIGFub3RoZXIuIAoKVG8gb3BlcmF0aW9uYWxpemUgdGhlc2UgcHJpbmNpcGxlcyBhbmQgdGVzdCBmb3IgY29uc2Vuc3VzIGluIHRoZSBkaXJlY3Rpb24gb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBhbnkgdHdvIGNvbmNlcHR1YWwgdW5pdHMsIEkgY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyB0byB6ZXJvIHZpYSBCYXllc2lhbiByZWdyZXNzaW9ucywgdXNpbmcgdGhlICJicm1zIiBwYWNrYWdlIGZvciBSIFtYWCBDSVRFXS4gSSBjb25kdWN0IGEgc2VwYXJhdGUgcmVncmVzc2lvbiBhbmFseXNpcyBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMsIGFjY291bnRpbmcgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgKGVmZmVjdC1jb2RlZCBzbyBhcyB0byBjZW50ZXIgdGhlIGludGVyY2VwdCBhdCB0aGUgZ3JhbmQgbWVhbikgYW5kIGFjY291bnRpbmcgZm9yIHdpdGhpbi1zdWJqZWN0cyBkZXNpZ25zIHdoZW4gYXBwcm9wcmlhdGUgKGkuZS4sIGZvciBTdHVkeSAxYyBhbmQgU3R1ZHkgNCkgYnkgaW5jbHVkaW5nIG1heGltYWwgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlcyAocmFuZG9tIGludGVyY2VwdHMgZm9yIHBhcnRpY2lwYW50cykuIEluIHRoZXNlIGFuYWx5c2VzLCBJIGFtIHByaW1hcmlseSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhlIGludGVyY2VwdCBpcyBlc3RpbWF0ZWQgdG8gYmUgZGlmZmVyZW50aWFibGUgZnJvbSB6ZXJvLCB3aGljaCBJIGdhdWdlIGJ5IGFzc2Vzc2luZyB3aGV0aGVyIHRoZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoZSBpbnRlcmNlcHQgY29udGFpbnMgemVyby4gCgpJIGNvbmR1Y3QgbWFueSBzdWNoIHJlZ3Jlc3Npb25zIGluIHRoaXMgY2hhcHRlcjogT25lIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBwYWlycyBvZiBjb25jZXB0dWFsIHVuaXRzIChfQk9EWSAtIEhFQVJUXywgX0JPRFkgLSBNSU5EXywgYW5kIF9IRUFSVCAtIE1JTkRfKSwgZm9yIGVhY2ggYWdlIGdyb3VwLCBmb3IgZWFjaCBzYW1wbGUuIEEgc3VtbWFyeSBvZiB0aGVzZSBpbnRlcmNlcHRzIGFjcm9zcyBhbGwgc2FtcGxlcyBhbmQgc3R1ZGllcyBjYW4gYmUgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGlzIGNoYXB0ZXIgKEZpZ3VyZSA0LjEwLCBwYW5lbCBCKS4gSW4gYWRkaXRpb24sIGZvciBzdHVkaWVzIHRoYXQgaW5jbHVkZSBhIGRldmVsb3BtZW50YWwgY29tcGFyaXNvbiAoU3R1ZGllcyAyLTQpLCBJIGNvbmR1Y3QgYW4gYWRkaXRpb25hbCBhbmFseXNpcyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgcGFpcnMgb2YgY29uY2VwdHVhbCB1bml0cywgaW5jbHVkaW5nIG1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb25zIHRvIGNvbXBhcmUgdGhlIGFnZSBncm91cHMgaW5jbHVkZWQgKGR1bW15LWNvZGVkIHdpdGggYWR1bHRzIGFzIHRoZSBiYXNlbGluZSk7IHRoZXNlIGFuYWx5c2VzIHByb3ZpZGUgZm9ybWFsIGFzc2Vzc21lbnRzIG9mIHRoZSBkZWdyZWUgdG8gd2hpY2ggY2hpbGRyZW4gZGlmZmVyIGZyb20gYWR1bHRzIGluIHRoZSBhc3ltbWV0cnkgb2YgdGhlaXIgcmVzcG9uc2VzIHRvIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMuIEkgZG8gbm90IGltcGxlbWVudCBhbnkgImNvcnJlY3Rpb25zIiBmb3IgbXVsdGlwbGUgY29tcGFyaXNvbnMsIGluIHBhcnQgYmVjYXVzZSBteSBldmFsdWF0aW9ucyBvZiB0aGVzZSBhbmFseXNlcyBhcmUgYmFzZWQgb24gY3JlZGlibGEgaW50ZXJ2YWxzIHJhdGhlciB0aGFuIF9wXy12YWx1ZXMgb3Igb3RoZXIgZnJlcXVlbnRpc3QgaW5kaWNlcyBvZiBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIFBhcmFtZXRlciBlc3RpbWF0ZXMgKF9iXykgY2FuIGJlIHVzZWQgYXMgaW5kaWNlcyBvZiBlZmZlY3Qgc2l6ZS4KCgojIFN0dWR5IDE6IEFuIGFkdWx0IGVuZHBvaW50CgpJbiB0aGUgY29udGV4dCBvZiB0aGlzIGRpc3NlcnRhdGlvbiwgU3R1ZHkgMSBzZXJ2ZXMgdG8gZGVzY3JpYmUgYSBkZXZlbG9wbWVudGFsIGVuZHBvaW50IGZvciBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZS4gSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHdoYXQgdGhpcyBzdHVkeSBjYW4gcmV2ZWFsIGFib3V0IHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb25jZXB0dWFsIHVuaXRzIGRpc2N1c3NlZCBpbiBDaGFwdGVyIElJSS4gVGhlc2UgYW5hbHlzZXMgd2VyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG9yaWdpbmFsIHB1YmxpY2F0aW9uIG9mIHRoaXMgd29yayAoV2Vpc21hbiBldCBhbC4sIDIwMTcpLgoKU3R1ZGllcyAxYS0xYyBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgYXNzZXNzaW5nIHRoZSBtZW50YWwgY2FwYWNpdGllcyBvZiBhIGJlZXRsZSwgYSByb2JvdCwgb3IgYm90aC4gU3R1ZGllcyAxYSBhbmQgMWIgd2VyZSBpZGVudGljYWw6IFVTIGFkdWx0cyAoU3R1ZHkgMWE6IF9uXz1gciBucm93KGQxYV9hZF93aWRlKWA7IFN0dWR5IDFiOiBfbl89YHIgbnJvdyhkMWJfYWRfd2lkZSlgKSBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIFN0dWR5IDFjIGVtcGxveWVkIHZlcnkgc2ltaWxhciBtZXRob2RzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBwYXJ0aWNpcGFudHMgKF9uXz1gciBucm93KGQxY19hZF93aWRlKS8yYCkgZWFjaCBhc3Nlc3NlZCBfYm90aF8gdGFyZ2V0IGNoYXJhY3RlcnMgc2lkZSBieSBzaWRlICh3aXRoIGxlZnQtcmlnaHQgcG9zaXRpb24gY291bnRlcmJhbGFuY2VkIGFjcm9zcyBwYXJ0aWNpcGFudHMpLiBCZWNhdXNlIHRoZXNlIHN0dWRpZXMgd2VyZSBzbyBzaW1pbGFyLCBpbiB0aGlzIGNoYXB0ZXIsIEkgd2lsbCBkaXNjdXNzIHRoZW0gaW4gdGFuZGVtLgoKU3R1ZHkgMWQgZW1wbG95ZWQgdGhlICJkaXZlcnNlIGNoYXJhY3RlcnMiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIGluIHdoaWNoIGByIG5yb3coZDFkX2FkX3dpZGUpYCBVUyBhZHVsdHMgd2VyZSByYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3MgdGhlIHNhbWUgc2V0IG9mIDQwIG1lbnRhbCBjYXBhY2l0aWVzIHVzZWQgaW4gU3R1ZGllcyAxYS0xZCBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgMjEgdGFyZ2V0IGNoYXJhY3RlcnM6IGFuIGFkdWx0LCBhIGNoaWxkLCBhbiBpbmZhbnQsIGEgcGVyc29uIGluIGEgcGVyc2lzdGVudCB2ZWdldGF0aXZlIHN0YXRlLCBhIGZldHVzLCBhIGNoaW1wYW56ZWUsIGFuIGVsZXBoYW50LCBhIGRvbHBoaW4sIGEgYmVhciwgYSBkb2csIGEgZ29hdCwgYSBtb3VzZSwgYSBmcm9nLCBhIGJsdWUgamF5LCBhIGZpc2gsIGEgYmVldGxlLCBhIG1pY3JvYmUsIGEgcm9ib3QsIGEgY29tcHV0ZXIsIGEgY2FyLCBvciBhIHN0YXBsZXIuIChTZWUgQ2hhcHRlciBJSSBhbmQgV2Vpc21hbiBldCBhbC4sIDIwMTcsIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIFJlc3VsdHMKCiMjIyBTdHVkaWVzIDFhLTFjCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QxYV9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMWFfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZCkKZDFhX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDFhX2FkLCBzY2FsZXNfZWZhX3dkbV9kMWFfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QxYV9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDFhX2FkIikKc2F2ZVJEUyhkMWFfYWRfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QxYV9hZF9zY29yZWRfYWQiKQpgYGAKCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMWJfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDFiX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWJfYWQpCmQxYl9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQxYl9hZCwgc2NhbGVzX2VmYV93ZG1fZDFiX2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMWJfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QxYl9hZCIpCnNhdmVSRFMoZDFiX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMWJfYWRfc2NvcmVkX2FkIikKYGBgCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDFjX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QxY19hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFjX2FkKQpkMWNfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkMWNfYWQsIHNjYWxlc19lZmFfd2RtX2QxY19hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDFjX2FkLCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kMWNfYWQiKQpzYXZlUkRTKGQxY19hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDFjX2FkX3Njb3JlZF9hZCIpCmBgYAoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QxZF9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMWRfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxZF9hZCkKZDFkX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDFkX2FkLCBzY2FsZXNfZWZhX3dkbV9kMWRfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QxZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDFkX2FkIikKc2F2ZVJEUyhkMWRfYWRfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QxZF9hZF9zY29yZWRfYWQiKQpgYGAKCmBgYHtyfQpmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZCkKZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWJfYWQpCmZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFjX2FkKQoKc2NhbGVzX2VmYV93ZG1fZDFhX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKQpzY2FsZXNfZWZhX3dkbV9kMWJfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpCnNjYWxlc19lZmFfd2RtX2QxY19hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKCkKYGBgCgpGb3IgZWFjaCBvZiB0aGVzZSB0aHJlZSBzdHVkaWVzLCBmb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFhX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QxYV9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2gsIHdpdGggYSBsYXJnZSBkZWdyZWUgb2Ygb3ZlcmxhcCBpbiBpdGVtcyBhY3Jvc3Mgc3R1ZGllczsgc2VlIFRhYmxlIDQuMS4KCmBgYHtyfQpzY2FsZXNfc3R1ZHkxIDwtIGJpbmRfcm93cyhzY2FsZXNfZWZhX3dkbV9kMWFfYWQgJT4lIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAxYSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kMWJfYWQgJT4lIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAxYiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kMWNfYWQgJT4lIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAxYyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kMWRfYWQgJT4lIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAxZCIpKSAlPiUKICBzZWxlY3QoLWMobG9hZGluZywgb3JkZXIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHNwcmVhZChzdHVkeSwgZmFjdG9yKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gaWZlbHNlKCFpcy5uYShgU3R1ZHkgMWFgKSwgYFN0dWR5IDFhYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoYFN0dWR5IDFiYCksIGBTdHVkeSAxYmAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShgU3R1ZHkgMWNgKSwgYFN0dWR5IDFjYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFN0dWR5IDFkYCkpKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QxYV9hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcjFhID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDFiX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyMWIgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMWNfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXIxYyA9IG9yZGVyKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QxZF9hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcjFkID0gb3JkZXIpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXIxYSwgb3JkZXIxYiwgb3JkZXIxYywgb3JkZXIxZCkgJT4lCiAgc2VsZWN0KC1jKHVyX2ZhY3Rvciwgc3RhcnRzX3dpdGgoIm9yZGVyIikpKQpgYGAKCmBgYHtyfQp0YWJsZTQuMSA8LSBzY2FsZXNfc3R1ZHkxICU+JQogIG11dGF0ZV9hdCh2YXJzKC1jYXBhY2l0eSksCiAgICAgICAgICAgIGZ1bnMoaWZlbHNlKGlzLm5hKC4pLCAiIiwgIuKckyIpKSkgJT4lCiAgcmVuYW1lKENhcGFjaXR5ID0gY2FwYWNpdHkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjE6IFNjYWxlcyBmb3IgZWFjaCBvZiB0aGUgY29uY2VwdHVhbCB1bml0cyAoZmFjdG9ycykgaWRlbnRpZmllZCBieSBFRkEgZm9yIFVTIEFkdWx0cyBpbiBTdHVkaWVzIDFhLTFkIChzZWUgQ2hhcHRlciBJSUkpLiBBIGNoZWNrbWFyayBpbmRpY2F0ZXMgdGhhdCBhIG1lbnRhbCBjYXBhY2l0eSB3YXMgaW5jbHVkZWQgaW4gYSBzY2FsZSBmb3IgYSBwYXJ0aWN1bGFyIHN0dWR5LiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgc2NhbGUiLCAxLCA5KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCBzY2FsZSIsIDEwLCAxNykgJT4lCiAgZ3JvdXBfcm93cygiTUlORCBzY2FsZSIsIDE4LCAyNikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC4xCmBgYAoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KcGxvdHNfZDFhX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQxYV9hZF9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ19kMWFfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QxYV9hZF9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxYV9hZF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxYV9hZF9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QxYV9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kMWFfYWRfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDFhX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QxYV9hZF9wbG90cywgZmlnX2QxYV9hZF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QxYV9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDFhOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QxYV9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kMWFfYWRfdGl0bGUsIGZpZ19kMWFfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KcGxvdHNfZDFiX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQxYl9hZF9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ19kMWJfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QxYl9hZF9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxYl9hZF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxYl9hZF9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkIxIiwgIkIyIiwgIkIzIiksIG5jb2wgPSAzKQoKZmlnX2QxYl9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kMWJfYWRfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDFiX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QxYl9hZF9wbG90cywgZmlnX2QxYl9hZF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QxYl9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDFiOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QxYl9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kMWJfYWRfdGl0bGUsIGZpZ19kMWJfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KcGxvdHNfZDFjX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQxY19hZF9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ19kMWNfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMxIiwgIkMyIiwgIkMzIiksIG5jb2wgPSAzKQoKZmlnX2QxY19hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kMWNfYWRfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDFjX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QxY19hZF9wbG90cywgZmlnX2QxY19hZF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QxY19hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDFjOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QxY19hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kMWNfYWRfdGl0bGUsIGZpZ19kMWNfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KcGxvdHNfZDFkX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQxZF9hZF9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczIxKQpgYGAKCmBgYHtyfQpmaWdfZDFkX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMWRfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWRfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWRfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJEMSIsICJEMiIsICJEMyIpLCBuY29sID0gMykKCmZpZ19kMWRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczIxLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gNykpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczIxLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gNykpKQoKZmlnX2QxZF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMWRfYWRfcGxvdHMsIGZpZ19kMWRfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjIpKQoKZmlnX2QxZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDFkOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QxZF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kMWRfYWRfdGl0bGUsIGZpZ19kMWRfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuMn0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2dyaWQoZmlnX2QxYV9hZF9wbG90c19sZWdfdGl0bGUsIAogICAgICAgICAgZmlnX2QxYl9hZF9wbG90c19sZWdfdGl0bGUsIAogICAgICAgICAgZmlnX2QxY19hZF9wbG90c19sZWdfdGl0bGUsIG5jb2wgPSAxKQpgYGAKClRoZSB2aXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSByZW1hcmthYmx5IHNpbWlsYXIgYWNyb3NzIFN0dWRpZXMgMWEtMWMgKHNlZSBGaWd1cmUgNC4xLCByb3dzIEEtQykuCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKRmlyc3QgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBIRUFSVCAoRmlndXJlIDQuMSwgbGVmdG1vc3QgY29sdW1uOiBwYW5lbHMgQTEsIEIxLCBhbmQgQzEpLiBUbyBteSBleWVzLCB0aGUgbW9zdCBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgdGhhdCAoMSkgdGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIHZpcnR1YWxseSBubyBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSksIGFuZCBjZXJ0YWlubHkgbm8gZGF0YXBvaW50cyBpbiB0aGUgdXBwZXIgbGVmdCBxdWFkcmFudCBvZiB0aGVzZSBwbG90cy4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIHRoYXQgbWFueSBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiwgYnV0IHZpcnR1YWxseSBubyBwYXJ0aWNpcGFudHMgYXR0cmlidXRlIG1vcmUgSEVBUlQgdGhhbiBCT0RZLiBUaGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gcHJpbWFyaWx5IGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZSAoaW4gcmVkKTsgZm9yIHRoZSByb2JvdCAoaW4gYmx1ZSksIF9CT0RZXyBhbmQgX0hFQVJUXyBzY29yZXMgYXBwZWFyIHRvIGhhdmUgYmVlbiBtb3JlIHNpbWlsYXIgKGNsb3NlIHRvIHRoZSBkb3R0ZWQgbGluZSksIGFuZCB3ZXJlIGdlbmVyYWxseSBxdWl0ZSBsb3cuIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjEsIGNlbnRlciBjb2x1bW46IHBhbmVscyBBMiwgQjIsIGFuZCBDMikuIFNpbWlsYXIgdG8gdGhlIEJPRFkgdnMuIEhFQVJUIGNvbXBhcmlzb24sIHR3byBub3RhYmxlIGZlYXR1cmVzIG9mIHRoZXNlIHZpc3VhbGl6YXRpb25zIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdCwgYW5kIG5vIGRhdGFwb2ludHMgaW4gdGhlIGxvd2VyIHJpZ2h0IHF1YWRyYW50IG9mIHRoZXNlIHBsb3RzLiBNb3N0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfTUlORF8gc2NhbGUgcm91Z2hseSBhcyBzdHJvbmdseSwgYW5kIHNvbWV0aW1lcyBtb3JlIHN0cm9uZ2x5LCB0aGFuIHRoZXkgZW5kb3JzZWQgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9CT0RZXyBzY2FsZSwgd2hpbGUgcmVsYXRpdmVseSBmZXcgcGFydGljaXBhbnRzIGVuZG9yc2VkIF9NSU5EXyBpdGVtcyBsZXNzIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zLiBIb3dldmVyLCB2aXN1YWwgaW5zcGVjdGlvbiBzdWdnZXN0cyB0aGF0IHRoaXMgYXN5bW1ldHJ5IHdhcyBsZXNzIGV4dHJlbWUgdGhhbiB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gX0JPRFlfIGFuZCBfSEVBUlRfIHNjb3JlcyBqdXN0IGRlc2NyaWJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gX0JPRFlfIGFuZCBfTUlORF8gYXBwZWFycyB0byBoYXZlIGJlZW4gZHJpdmVuIHByaW1hcmlseSBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCAoaW4gYmx1ZSk7IGZvciB0aGUgYmVldGxlIChpbiByZWQpLCBfQk9EWV8gYW5kIF9NSU5EXyBzY29yZXMgYXBwZWFyIHRvIGhhdmUgYmVlbiBtb3JlIHNpbWlsYXIgKGNsb3NlIHRvIHRoZSBkb3R0ZWQgbGluZSkuIAoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkZpbmFsbHkgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQuMSwgcmlnaHRtb3N0IGNvbHVtbjogcGFuZWxzIEEzLCBCMywgYW5kIEMzKS4gQWdhaW4sIHR3byBmZWF0dXJlcyBvZiB0aGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgcGFydGljdWxhcmx5IHN0cmlraW5nOiAoMSkgVGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9NSU5EXyBhbmQgX0hFQVJUXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIHZpcnR1YWxseSBfbm9fIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKS4gVGhlIGFzeW1tZXRyeSBiZXR3ZWVuIF9NSU5EXyBhbmQgX0hFQVJUXyBzY29yZXMgYXBwZWFycyB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IGV4dHJlbWU6IEFsbW9zdCBfYWxsXyBwYXJ0aWNpcGFudHMgZW5kb3JzZWQgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIG1vcmUgc3Ryb25nbHkgdGhhbiB0aGUgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGUuIEluIHRoaXMgY2FzZSwgdGhpcyBhc3ltbWV0cnkgYXBwZWFycyB0byBiZSBib3JuIG91dCBmb3IgYm90aCB0YXJnZXQgY2hhcmFjdGVycywgYnV0IHBlcmhhcHMgbW9yZSBleGFnZ2VyYXRlZCBmb3IgdGhlIGJlZXRsZSAoaW4gcmVkKSB0aGFuIHRoZSByb2JvdCAoaW4gYmx1ZSkuCgpgYGB7cn0KZmlndXJlNC4xIDwtIHBsb3RfZ3JpZChmaWdfZDFhX2FkX3Bsb3RzX2xlZ190aXRsZSwgZmlnX2QxYl9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QxY19hZF9wbG90c19sZWdfdGl0bGUsIGZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDEsIDEuMTUpKQoKZmlndXJlNC4xX2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuMSwgc3RyX3dyYXAoIkZpZ3VyZSA0LjE6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkaWVzIDFhLTFkLCBvcmdhbml6ZWQgYnkgc3R1ZHkgKHJvd3MpIGFuZCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4gUGVhcnNvbiBjb3JyZWxhdGlvbnMgYXJlIHJlcG9ydGVkIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cy4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuOH0KZ2dkcmF3KGZpZ3VyZTQuMV9jYXApCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gRm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKSwgSSBjb25kdWN0IGEgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSB0d28gImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzIChhIGJlZXRsZSB2cyBhIHJvYm90KSwgYW5kIGluY2x1ZGluZyBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZXMgKGluIHRoaXMgY2FzZSwgbm8gcmFuZG9tIGVmZmVjdHMgZm9yIFN0dWRpZXMgMWEgYW5kIDFiLCBhbmQgcmFuZG9tIGludGVyY2VwdHMgZm9yIHBhcnRpY2lwYW50cyBpbiBTdHVkeSAxYykuIFNlZSBGaWd1cmUgNC4yLCBwYW5lbHMgQS1DIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkMWFfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFhX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQxYV9hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMWFfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMWFfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxYV9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFhX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFhX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULCAKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsIAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFhX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELCAKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMWFfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIlN0dWR5IDFhIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKCmBgYHtyfQpkMWJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFiX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQxYl9hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMWJfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMWJfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxYl9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFiX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFiX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFiX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMWJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIlN0dWR5IDFiIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKCmBgYHtyfQpkMWNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFjX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQxY19hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMWNfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMWNfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxY19hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFjX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQxY19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQxY19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxY19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMWNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIlN0dWR5IDFjIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CmQxZF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkMWRfYWRfc2NvcmVkX2FkKQpjb250cmFzdHMoZDFkX2FkX3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9kdjIxCgpzYXZlUkRTKGQxZF9hZF9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QxZF9hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDFkX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkMWRfYWRfc2NvcmVkX2FkX2RpZmYsIGNvbG9ycyA9IGNvbG9yczIxKQpgYGAKCmBgYHtyfQojIGQxZCByZWdyZXNzaW9ucyBkb25lIGJlbG93CmBgYAoKYGBge3J9CnJlZ3RhYl9zdHVkeTFhYmMgPC0gcmVndGFiX2QxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBmdWxsX2pvaW4ocmVndGFiX2QxYl9hZF9zY29yZWRfYWRfZGlmZikgJT4lCiAgZnVsbF9qb2luKHJlZ3RhYl9kMWNfYWRfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgU3R1ZHkgMWFgLCBjKCJzMWFfYiIsICJzMWFfcy5lLiIsICJzMWFfOTUlIENJIiwgInMxYV9ueiIpLCBzZXAgPSAiXyIpICU+JQogIHNlcGFyYXRlKGBTdHVkeSAxYmAsIGMoInMxYl9iIiwgInMxYl9zLmUuIiwgInMxYl85NSUgQ0kiLCAiczFiX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYFN0dWR5IDFjYCwgYygiczFjX2IiLCAiczFjX3MuZS4iLCAiczFjXzk1JSBDSSIsICJzMWNfbnoiKSwgc2VwID0gIl8iKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfc3R1ZHkxYWJjICU+JQogIHNlbGVjdCgtZW5kc193aXRoKCJzLmUuIikpICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9ncmlkKHBsb3RfZDFhX2FkX3Njb3JlZF9hZF9kaWZmLCAKICAgICAgICAgIHBsb3RfZDFiX2FkX3Njb3JlZF9hZF9kaWZmLCAKICAgICAgICAgIHBsb3RfZDFjX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgbmNvbCA9IDMpCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFjcm9zcyBTdHVkaWVzIDFhLTFjLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX0JPRFlfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuIEFzIEkgc3BlY3VsYXRlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgaW4gYWxsIHN0dWRpZXMgdGhpcyBkaWZmZXJlbmNlIHdhcyBkcml2ZW4gYnkgcGFydGljaXBhbnRzJyBhc3Nlc3NtZW50cyBvZiB0aGUgYmVldGxlOyBpbiB0aGUgYWdncmVnYXRlLCBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHJlZHVjZWQgdG8gMCBmb3IgdGhlIHJvYm90IChzZWUgdGhlICJSb2JvdCB2cy4gR00iIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuICAKCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkFjcm9zcyBTdHVkaWVzIDFhLTFjLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuIEluIGFsbCBzdHVkaWVzIHRoaXMgZGlmZmVyZW5jZSB3YXMgZHJpdmVuIGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90OyBpbiB0aGUgYWdncmVnYXRlLCBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHJlZHVjZWQgdG8gMCBmb3IgdGhlIGJlZXRsZSAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQWNyb3NzIFN0dWRpZXMgMWEtMWMsIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC4yKS4gSW4gYWxsIHN0dWRpZXMgdGhpcyBkaWZmZXJlbmNlIHdhcyBzb21ld2hhdCBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QsIHJlbGF0aXZlIHRvIHRoZSBiZWV0bGUgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC4yKS4KCmBgYHtyfQpmaWd1cmU0LjJfcGxvdHMxMjMgPC0gcGxvdF9ncmlkKHBsb3RfZDFhX2FkX3Njb3JlZF9hZF9kaWZmICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFhOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxYl9hZF9zY29yZWRfYWRfZGlmZiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJTdHVkeSAxYjogQWR1bHRzIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxY19hZF9zY29yZWRfYWRfZGlmZiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJTdHVkeSAxYzogQWR1bHRzIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDMsIHJlbF93aWR0aHMgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9ICJBVVRPIikKCmZpZ3VyZTQuMl9wbG90czEyM19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMl9wbG90czEyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxYV9hZF9zY29yZWRfYWRfZGlmZiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMSkpCgpmaWd1cmU0LjJfcGxvdHM0IDwtIHBsb3RfZ3JpZChwbG90X2QxZF9hZF9zY29yZWRfYWRfZGlmZiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJTdHVkeSAxZDogQWR1bHRzIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9ICJEIikKCmZpZ3VyZTQuMl9wbG90czRfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJfcGxvdHM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9kMWRfYWRfc2NvcmVkX2FkX2RpZmYgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMikpCgpmaWd1cmU0LjJfcGxvdHMgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMl9wbG90czEyM19sZWcsIGZpZ3VyZTQuMl9wbG90czRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMS4xKSkKCmZpZ3VyZTQuMl9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjJfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgNC4yOiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cycgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZGllcyAxYS0xZC4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEsIHN1Y2ggdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIC0xIHRvICsxLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gZGlmZmVyZW5jZSBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQgKGkuZS4sIGEgZGlmZmVyZW5jZSBzY29yZSBvZiAwKS4iLCAxNDApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0KZ2dkcmF3KGZpZ3VyZTQuMl9jYXApCmBgYAoKYGBge3J9CnRhYmxlNC4yIDwtIHJlZ3RhYl9zdHVkeTFhYmMgJT4lCiAgc2VsZWN0KC1wYWlyLCAtZW5kc193aXRoKCJfcy5lLiIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0pICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJueiIsICIgIiwgLikpKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigiczEuXyIsICIiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjI6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgZm9yIFVTIGFkdWx0cyBpbiBTdHVkaWVzIDFhLTFjLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gSW50ZXJjZXB0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gYm9sZCwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHByaW1hcnkgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHRhYmxlIGluY2x1ZGVzIHRoZSBlc3RpbWF0ZSAoYikgYW5kIGEgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGF0IGVzdGltYXRlLiBBc3Rlcmlza3MgaW5kaWNhdGUgOTUlIGNyZWRpYmxlIGludGVydmFscyB0aGF0IGRvIG5vdCBpbmNsdWRlIDAuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygxLCAzLCA1KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDIpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMywgNCkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgLSBNSU5EIiwgNSwgNikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJTdHVkeSAxYSIgPSAzLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMWIiID0gMywKICAgICAgICAgICAgICAgICAgICAgIlN0dWR5IDFjIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjIKYGBgCgojIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKQWNyb3NzIFN0dWRpZXMgMWEtMWMsIHZpc3VhbCBpbnNwZWN0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb25jZXB0dWFsIHVuaXRzIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUkgKEJPRFksIEhFQVJULCBhbmQgTUlORCkgc3VnZ2VzdGVkIHRoYXQgYWxsIG9mIHRoZXNlIHJlbGF0aW9uc2hpcHMgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgdHdvIGZlYXR1cmVzOiAoMSkgUG9zaXRpdmUgY29udGluZ2VuY2llcywgc3VjaCB0aGF0IHRoZSBtb3JlIHN0cm9uZ2x5IGEgcGFydGljaXBhbnQgZW5kb3JzZWQgb25lIGNvbmNlcHR1YWwgdW5pdCwgdGhlIG1vcmUgc3Ryb25nbHkgdGhleSB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgb3RoZXJzOyBhbmQgKDIpIFJvYnVzdCBhc3ltbWV0cmllcywgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIG9yIEhFQVJULCBhbmQgSEVBUlQgbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQuIFRoZXNlIGFzeW1tZXRyaWVzIHdlcmUgbW9zdCBwcm9ub3VuY2VkIGZvciBjb21wYXJpc29ucyBpbnZvbHZpbmcgSEVBUlQsIHdpdGggdGhlIHZhc3QgbWFqb3JpdHkgb2YgcGFydGljaXBhbnRzIGluIGFsbCB0aHJlZSBvZiB0aGVzZSBzdHVkaWVzIGVuZG9yc2luZyBib3RoIEJPRFkgYW5kIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJUIGZvciBib3RoIG9mIHRoZSAiZWRnZSBjYXNlIiBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoZXNlIHN0dWRpZXMgKGEgYmVldGxlIGFuZCBhIHJvYm90KS4gCgpGb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGluIFN0dWRpZXMgMWEtMWMgY29uZmlybWVkIHRoZXNlIGluZm9ybWFsIG9ic2VydmF0aW9ucy4KCiMjIyBTdHVkeSAxZAoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQojIGRvbmUgYWJvdmUKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFkX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QxZF9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2gsIHdpdGggYSBsYXJnZSBkZWdyZWUgb2Ygb3ZlcmxhcCBpbiBpdGVtcyBiZXR3ZWVuIHRoZXNlIHNjYWxlcyBhbmQgdGhlIHNjYWxlcyBkZXJpdmVkIGZyb20gU3R1ZGllcyAxYS0xYzsgc2VlIFRhYmxlIDQuMS4KCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CiMgZG9uZSBhYm92ZQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40NX0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDFkX2FkX3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjEsIHJvdyBELgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LjEsIHBhbmVsIEQxKS4gTXVjaCBhcyBpbiBTdHVkaWVzIDFhLTFjIChyb3dzIEEtQyksIHRoZSBtb3N0IHN0cmlraW5nIGZlYXR1cmVzIG9mIHRoaXMgdmlzdWFsaXphdGlvbiBhcmUgdGhhdCAoMSkgdGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIHZpcnR1YWxseSBubyBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSksIGFuZCBjZXJ0YWlubHkgbm8gZGF0YXBvaW50cyBpbiB0aGUgdXBwZXIgbGVmdCBxdWFkcmFudC4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIG1hbnkgcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24sIGJ1dCB2aXJ0dWFsbHkgbm8gcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIEJPRFkuIAoKVmlzdWFsIGluc3BlY3Rpb24gb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciBmdXJ0aGVyIHJldmVhbHMgdGhhdCwgaW4gdGhlIGFnZ3JlZ2F0ZSwgY2hhcmFjdGVycyB0aGF0IHJlY2VpdmVkIHJlbGF0aXZlbHkgbG93IF9CT0RZXyBzY29yZXMgKGUuZy4sIGluZXJ0IG9iamVjdHMsIHRlY2hub2xvZ2llcywgdGhlIGZldHVzLCB0aGUgcGVyc29uIGluIGEgcGVyc2lzdGVudCB2ZWdldGF0aXZlIHN0YXRlLCBhbmQgc3VjaCAibG93ZXIiIGxpZmVmb3JtcyBhcyBhIG1pY3JvYmUpIHJlY2VpdmVkIHVuaXZlcnNhbGx5IGxvdyBtZWFuIF9IRUFSVF8gc2NvcmVzLCB3aGlsZSBjaGFyYWN0ZXJzIHRoYXQgcmVjZWl2ZWQgcmVsYXRpdmVseSBoaWdoIF9CT0RZXyBzY29yZXMgKGUuZy4sICJoaWdoZXIiIGxpZmVmb3JtcyBsaWtlIGFuaW1hbHMgYW5kIHR5cGljYWwgaHVtYW5zKSB2YXJpZWQgaW4gdGhlaXIgbWVhbiBfSEVBUlRfIHNjb3Jlcy4gVGhpcyByYWlzZXMgdGhlIGludHJpZ3VpbmcgcG9zc2liaWxpdHkgdGhhdCBhdHRyaWJ1dGlvbnMgb2YgQk9EWSBhbmQgSEVBUlQgbWF5IGhhdmUgYmVlbiBnb3Zlcm5lZCBieSBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwsIGluIHdoaWNoIGF0dHJpYnV0aW9ucyBvZiBhbnkgc3Vic3RhbnRpYWwgYW1vdW50IG9mIEhFQVJUIGRlcGVuZCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciBoYXZpbmcgYSBjZXJ0YWluIGRlZ3JlZSBvZiBCT0RZLgoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjEsIHBhbmVsIEQyKS4gQXMgaW4gU3R1ZGllcyAxYS0xYywgdHdvIG5vdGFibGUgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSBkYXRhcG9pbnRzIGluIHRoZSB1cHBlciBsZWZ0IGJ1dCBub3QgdGhlIGxvd2VyIHJpZ2h0IHF1YWRyYW50cy4gSG93ZXZlciwgd2hpbGUgcGFydGljaXBhbnRzIHdobyBhc3Nlc3NlZCBjZXJ0YWluIHRhcmdldCBjaGFyYWN0ZXJzIChuYW1lbHksIHRoZSB0ZWNobm9sb2dpZXMpIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSByb3VnaGx5IGFzIHN0cm9uZ2x5LCBhbmQgc29tZXRpbWVzIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlLCBwYXJ0aWNpcGFudHMgd2hvIGFzc2Vzc2VkIG90aGVyIHRhcmdldCBjaGFyYWN0ZXJzLCBpZiBhbnl0aGluZywgYXBwZWFyIHRvIGhhdmUgc2hvd24gdGhlIHJldmVyc2UgcGF0dGVybiwgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBzbGlnaHRseSBsZXNzIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zLiBJbiBvdGhlciB3b3JkcywgdGhlcmUgYXBwZWFycyB0byBiZSBhIGxlc3MgY29uc2lzdGVuY3kgaW4gdGhlICJhc3ltbWV0cnkiIGJldHdlZW4gQk9EWSBhbmQgTUlORCBpbiBTdHVkeSAxZCB0aGFuIHRoZXJlIHdhcyBpbiBTdHVkaWVzIDFhLTFjLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkZpbmFsbHkgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQuMSwgcGFuZWwgRDEpLiBNdWNoIGFzIGluIFN0dWRpZXMgMWEtMWMgKHJvd3MgQS1DKSwgdGhlIG1vc3Qgc3RyaWtpbmcgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlczsgYW5kICgyKSB0aGVyZSBhcmUgdmlydHVhbGx5IG5vIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSwgYW5kIGNlcnRhaW5seSBubyBkYXRhcG9pbnRzIGluIHRoZSBsb3dlciByaWdodCBxdWFkcmFudC4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIG1hbnkgcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24sIGJ1dCB2aXJ0dWFsbHkgbm8gcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIE1JTkQuIAoKVmlzdWFsIGluc3BlY3Rpb24gb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciBmdXJ0aGVyIHJldmVhbHMgdGhhdCwgaW4gdGhlIGFnZ3JlZ2F0ZSwgY2hhcmFjdGVycyB0aGF0IHJlY2VpdmVkIHJlbGF0aXZlbHkgbG93IF9NSU5EXyBzY29yZXMgKGUuZy4sIGluZXJ0IG9iamVjdHMsIHRoZSBmZXR1cywgYW5kIHN1Y2ggImxvd2VyIiBsaWZlZm9ybXMgYXMgYSBtaWNyb2JlKSByZWNlaXZlZCB1bml2ZXJzYWxseSBsb3cgbWVhbiBfSEVBUlRfIHNjb3Jlcywgd2hpbGUgY2hhcmFjdGVycyB0aGF0IHJlY2VpdmVkIHJlbGF0aXZlbHkgaGlnaCBfTUlORF8gc2NvcmVzIChlLmcuLCBtb3JlIHNvcGhpc3RpY2F0ZWQgdGVjaG5vbG9naWVzIGFzIHdlbGwgYXMgImhpZ2hlciIgbGlmZWZvcm1zIGxpa2UgYW5pbWFscyBhbmQgdHlwaWNhbCBodW1hbnMpIHZhcmllZCBpbiB0aGVpciBtZWFuIF9IRUFSVF8gc2NvcmVzLiBBcyBpbiB0aGUgQk9EWSB2cy4gSEVBUlQgY29tcGFyaXNvbiBkaXNjdXNzZWQgZWFybGllciwgdGhpcyByYWlzZXMgdGhlIGludHJpZ3VpbmcgcG9zc2liaWxpdHkgdGhhdCBhdHRyaWJ1dGlvbnMgb2YgSEVBUlQgYW5kIE1JTkQgbWF5IGhhdmUgYmVlbiBnb3Zlcm5lZCBieSBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwsIGluIHdoaWNoIGF0dHJpYnV0aW9ucyBvZiBhbnkgc3Vic3RhbnRpYWwgYW1vdW50IG9mIEhFQVJUIGRlcGVuZCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciBoYXZpbmcgYSBjZXJ0YWluIGRlZ3JlZSBvZiBNSU5ELgoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gQXMgaW4gU3R1ZGllcyAxYS0xYywgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLCBJIGNvbmR1Y3QgYSBCYXllc2lhbiByZWdyZXNzaW9uIHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSAyMSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gU2VlIEZpZ3VyZSA0LjIsIHBhbmVsIEQsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQojIGZpZ3VyZSBkb25lIGFib3ZlCmBgYAoKYGBge3J9CiMgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QxZF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiU3R1ZHkgMWQiLAogIGNoYXJfbGFiZWwgPSBjKCJBZHVsdCB2cy4gR00iLCAiQ2hpbGQgdnMuIEdNIiwgIkluZmFudCB2cy4gR00iLCAiUFZTIHZzLiBHTSIsIAogICAgICAgICAgICAgICAgICJGZXR1cyB2cy4gR00iLCAiQ2hpbXBhbnplZSB2cy4gR00iLCAiRWxlcGhhbnQgdnMuIEdNIiwgCiAgICAgICAgICAgICAgICAgIkRvbHBoaW4gdnMuIEdNIiwgIkJlYXIgdnMuIEdNIiwgIkRvZyB2cy4gR00iLCAiR29hdCB2cy4gR00iLCAKICAgICAgICAgICAgICAgICAiTW91c2UgdnMuIEdNIiwgIkZyb2cgdnMuIEdNIiwgIkJsdWUgamF5IHZzLiBHTSIsICJGaXNoIHZzLiBHTSIsIAogICAgICAgICAgICAgICAgICJCZWV0bGUgdnMuIEdNIiwgIk1pY3JvYmUgdnMuIEdNIiwgIlJvYm90IHZzLiBHTSIsIAogICAgICAgICAgICAgICAgICJDb21wdXRlciB2cy4gR00iLCAiQ2FyIHZzLiBHTSIpKQpgYGAKCmBgYHtyfQpyZWd0YWJfc3R1ZHkxZCA8LSByZWd0YWJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgU3R1ZHkgMWRgLCBjKCJzMWRfYiIsICJzMWRfcy5lLiIsICJzMWRfOTUlIENJIiwgInMxZF9ueiIpLCBzZXAgPSAiXyIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9zdHVkeTFkICU+JQogIHNlbGVjdCgtZW5kc193aXRoKCJzLmUuIikpICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9kMWRfYWRfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKVGhlc2UgcmVncmVzc2lvbiBhbmFseXNlcyBjb25maXJtZWQgdGhhdCBpbiBTdHVkeSAxZCwgYXMgaW4gU3R1ZGllcyAxYS0xYywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjMpLiAKClRoaXMgYXN5bW1ldHJ5IHdhcyBtb3JlIHByb25vdW5jZWQgZm9yIHNvbWUgY2hhcmFjdGVycywgYW5kIGxlc3MgcHJvbm91bmNlZCBmb3Igb3RoZXJz4oCUbmFtZWx5LCBodW1hbnMgKHdobyBnZW5lcmFsbHkgcmVjZWl2ZWQgaGlnaCBzY29yZXMgb24gYm90aCB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcykgYW5kIHRlY2hub2xvZ2llcyAod2hvIGdlbmVyYWxseSByZWNlaXZlZCBsb3cgc2NvcmVzIG9uIGJvdGggdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMpLiBBIGZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgY2hhcHRlciwgYnV0IGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoZXJlIHdlcmUgbm8gY2hhcmFjdGVycyBmb3Igd2hvbSB0aGlzIGFzeW1tZXRyeSB3YXMgc3lzdGVtYXRpY2FsbHkgcmV2ZXJzZWQgKGkuZS4sIHdobyB3ZXJlIGdlbmVyYWxseSBjb25zaWRlcmVkIHRvIGhhdmUgbW9yZSBIRUFSVCB0aGFuIEJPRFkgY2FwYWNpdGllcykuIFNlZSBGaWd1cmUgNC4yLCBwYW5lbCBELCBhbmQgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjMuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlZCB0aGF0IGluIFN0dWR5IDFkLCBpbiBjb250cmFzdCB0byBTdHVkaWVzIDFhLTFjLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIG9ubHkgdmVyeSBzbGlnaHRseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC4zKS4KCkFnYWluLCB0aGlzIGFzeW1tZXRyeSB3YXMgbW9yZSBwcm9ub3VuY2VkIGZvciBzb21lIGNoYXJhY3RlcnPigJRuYW1lbHksIHRlY2hub2xvZ2llcyAod2hvIGdlbmVyYWxseSByZWNlaXZlZCBoaWdoIHNjb3JlcyBvbiB0aGUgX01JTkRfIHNjYWxlIGFuZCBsb3cgc2NvcmVzIG9uIHRoZSBfQkRPWV8gc2NhbGUp4oCUYW5kIGxlc3MgcHJvbm91bmNlZCBmb3Igb3RoZXJzLiBJbmRlZWQsIHRoZXJlIHdlcmUgc29tZSBjaGFyYWN0ZXJzIChlLmcuLCB0aGUgY2hpbGQsIHRoZSBpbmZhbnQsIHRoZSBmZXR1cywgYW5kIGEgaGFuZGZ1bCBvZiBub24taHVtYW4gYW5pbWFscykgZm9yIHdob20gdGhpcyBhc3ltbWV0cnkgdGVuZGVkIHRvIHJ1biBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCB3aXRoIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGluZyBtb3JlIEJPRFkgdGhhbiBNSU5EIGNhcGFjaXRpZXMuIFNlZSBGaWd1cmUgNC4yLCBwYW5lbCBELCBhbmQgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMy4KCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGNvbmZpcm1lZCB0aGF0IGluIFN0dWR5IDFkLCBhcyBpbiBTdHVkaWVzIDFhLTFjLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMykuCgpTaW1pbGFyIHRvIHRoZSBCT0RZIHZzLiBIRUFSVCBjb21wYXJpc29uLCB0aGlzIGFzeW1tZXRyeSB3YXMgbGVzcyBwcm9ub3VuY2VkIGZvciBodW1hbnMgKHdobyBnZW5lcmFsbHkgcmVjZWl2ZWQgaGlnaCBzY29yZXMgb24gYm90aCB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyksIGFuZCBtb3JlIHByb25vdW5jZWQgZm9yIG90aGVyIGNoYXJhY3RlcnMuIEEgZnVsbCBkaXNjdXNzaW9uIG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBjaGFwdGVyLCBidXQgaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlcmUgd2VyZSBubyBjaGFyYWN0ZXJzIGZvciB3aG9tIHRoaXMgYXN5bW1ldHJ5IHdhcyBzeXN0ZW1hdGljYWxseSByZXZlcnNlZCAoaS5lLiwgd2hvIHdlcmUgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgdG8gaGF2ZSBtb3JlIEhFQVJUIHRoYW4gTUlORCBjYXBhY2l0aWVzKS4gU2VlIEZpZ3VyZSA0LjIsIHBhbmVsIEQsIGFuZCB0aGUgdmFyaW91cyBjb21wYXJpc29ucyBvZiB0YXJnZXQgY2hhcmFjdGVycyB0byB0aGUgZ3JhbmQgbWVhbiBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMy4KCiMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpJbiBTdHVkeSAxZCwgbWFueSBvZiB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiBTdHVkaWVzIDFhLTFjIHdlcmUgdXBoZWxkLiBJbiBwYXJ0aWN1bGFyLCAoMSkgVGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBCT0RZIHZzLiBIRUFSVCBhbmQgYmV0d2VlbiBNSU5EIHZzLiBIRUFSVCBhcHBlYXIgdG8gYmUgcG9zaXRpdmUsIHN1Y2ggdGhhdCB0aGUgbW9yZSBzdHJvbmdseSBhIHBhcnRpY2lwYW50IGVuZG9yc2VkIG9uZSBjb25jZXB0dWFsIHVuaXQsIHRoZSBtb3JlIHN0cm9uZ2x5IHRoZXkgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG90aGVyOyBhbmQgKDIpIFRoZXJlIGFwcGVhciB0byBiZSByb2J1c3QgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBib3RoIEJPRFkgb3IgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIAoKSG93ZXZlciwgdmlzdWFsIGluc3BlY3Rpb24gb2YgdGhlIEJPRFkgdnMuIE1JTkQgc2NhdHRlcnBsb3QgZm9yIFN0dWR5IDFkIHN1Z2dlc3RzIHRoYXQgdGhpcyByZWxhdGlvbnNoaXAgd2FzIHF1aXRlIHZhcmlhYmxlIGFjcm9zcyBwYXJ0aWNpcGFudHMgYW5kIGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycy4gVGhpcyBzdGFuZHMgaW4gY29udHJhc3QgdG8gdGhlIG1vcmUgc3lzdGVtYXRpYyBhc3ltbWV0cnkgdGhhdCBlbWVyZ2VkIGluIFN0dWRpZXMgMWEtMWMsIGluIHdoaWNoIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIChwYXJ0aWN1bGFybHkgdG8gdGhlIHJvYm90KS4KClRoZXNlIGZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgaW4gU3R1ZHkgMWQgY29uZmlybWVkIHRoZXNlIGluZm9ybWFsIG9ic2VydmF0aW9uczogUGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIGJvdGggQk9EWSBhbmQgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIEluIHRoZSBhZ2dyZWdhdGUsIHRoZXJlIHdhcyBhIHNsaWdodCB0ZW5kZW5jeSBmb3IgcGFydGljaXBhbnRzIHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSwgYnV0IHRoaXMgYXN5bW1ldHJ5IHdhcyB3ZWFrIGFuZCBoaWdobHkgY29udGluZ2VudCBvbiB0aGUgcGFydGljdWxhciB0YXJnZXQgY2hhcmFjdGVyIHRoYXQgcGFydGljaXBhbnRzIHdlcmUgYXNzaWduZWQgdG8gYXNzZXNzLgoKYGBge3J9CnRhYmxlNC4zIDwtIHJlZ3RhYl9zdHVkeTFkICU+JQogIHNlbGVjdCgtcGFpciwgLWVuZHNfd2l0aCgiX3MuZS4iKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigibnoiLCAiICIsIC4pKSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoInMxLl8iLCAiIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC4zOiBSZWdyZXNzaW9uIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGZvciBVUyBhZHVsdHMgaW4gU3R1ZHkgMWQuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgdHdvIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb247IGFuZCAoMikgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMsIHJlcG9ydGVkIGhlcmUgYXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gZWFjaCBjaGFyYWN0ZXIgYW5kIHRoZSBncmFuZCBtZWFuIChHTSkuIEludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMSwgMjIsIDQzKSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDIxKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gTUlORCIsIDIyLCA0MikgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgLSBNSU5EIiwgNDMsIDYzKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgIlN0dWR5IDFkIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjMKYGBgCgojIyBEaXNjdXNzaW9uCgpYWCBfX0lOU0VSVCBTVFVEWSAxIERJU0NVU1NJT05fXwoKU3R1ZGllcyAxYS0xZCBjb252ZXJnZSB0byBzdWdnZXN0IHRoYXQgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5ELCBhcmUgY2hhcmFjdGVyaXplZCBieSBiZWluZyAoMSkgcG9zaXRpdmUsIHN1Y2ggdGhhdCB0aGUgbW9yZSBzdHJvbmdseSBhIHBhcnRpY2lwYW50IGVuZG9yc2VkIG9uZSBjb25jZXB0dWFsIHVuaXQsIHRoZSBtb3JlIHN0cm9uZ2x5IHRoZXkgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG90aGVyOyBhbmQgKDIpIGFzeW1tZXRyaWNhbCwgc3VjaCB0aGF0IGNlcnRhaW4gY29uY2VwdHVhbCB1bml0cyBhcmUgc3lzdGVtYXRpY2FsbHkgZW5kb3JzZWQgbW9yZSBzdHJvbmdseSB0aGFuIG90aGVycy4gSW4gcGFydGljdWxhciwgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcGFydGljaXBhbnRzIGFjcm9zcyBhbGwgZm91ciBvZiB0aGVzZSBzdHVkaWVzIGVuZG9yc2VkIGJvdGggQk9EWSBhbmQgTUlORCBhdCBsZWFzdCBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBIRUFSVCwgcmVnYXJkbGVzcyBvZiB3aGljaCB0YXJnZXQgY2hhcmFjdGVyIHRoZXkgd2VyZSBhc3Nlc3Npbmcgb3IgaG93IHN0cm9uZyB0aGVpciBlbmRvcnNlbWVudHMgd2VyZSBpbiBhYnNvbHV0ZSB0ZXJtcy4gVGFrZW4gdG9nZXRoZXIsIEkgY29uc2lkZXIgdGhpcyB0byBiZSBmYWlybHkgc3Ryb25nIGV2aWRlbmNlIHRoYXQgdGhlIGNvbmNlcHR1YWwgdW5pdHMgdGhhdCBJIGhhdmUgY2FsbGVkIEJPRFkgYW5kIE1JTkQgYXJlIG1vcmUgYmFzaWMgb3IgZnVuZGFtZW50YWwgdGhhbiB0aGUgdW5pdCB0aGF0IEkgcmVmZXIgdG8gYXMgSEVBUlQuCgpUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdHdvIG1vcmUgImJhc2ljIiBjb25jZXB0dWFsIHVuaXRz4oCUQk9EWSBhbmQgTUlOROKAlGFwcGVhcnMgdG8gYmUgbW9yZSBjb21wbGljYXRlZC4gQWNyb3NzIFN0dWRpZXMgMWEtMWQsIGluIHRoZSBhZ2dyZWdhdGUgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIE1JTkQgKHNsaWdodGx5KSBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWS4gSG93ZXZlciwgaW4gZWFjaCBzdHVkeSB0aGlzIGFzeW1tZXRyeSB3YXMgZHJpdmVuIGJ5IGFzc2Vzc21lbnRzIG9mIGEgcGFydGljdWxhciBraW5kIG9mIHRhcmdldCBjaGFyYWN0ZXI6IHRlY2hub2xvZ2llcyAodGhlIHJvYm90IGluIFN0dWRpZXMgMWEtMWM7IHRoZSByb2JvdCwgY29tcHV0ZXIsIGFuZCBjYXIgaW4gU3R1ZHkgMWQpLiBGb3Igb3RoZXIgdGFyZ2V0IGNoYXJhY3RlcnMgKGluY2x1ZGluZyB0aGUgYmVldGxlIGluIFN0dWRpZXMgMWEtMWMsIGFzIHdlbGwgYXMgbWFueSBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gU3R1ZHkgMWQpLCBhdmVyYWdlIGRpZmZlcmVuY2Ugc2NvcmVzIGhvdmVyZWQgYXJvdW5kIHplcm8sIHdpdGggc29tZSBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQsIG90aGVycyBlbmRvcnNpbmcgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSwgYW5kIHN0aWxsIG90aGVycyBlbmRvcnNpbmcgQk9EWSBhbmQgTUlORCB0byByb3VnaGx5IGVxdWFsIGRlZ3JlZXMuIEluIFN0dWR5IDFkIHRoZXJlIHdlcmUgZXZlbiBhIGZldyB0YXJnZXQgY2hhcmFjdGVyc+KAlG5hbWVseSwgaW1tYXR1cmUgaHVtYW5zIGFuZCBhIGhhbmRmdWwgb2Ygbm9uLWh1bWFuIGFuaW1hbHPigJRmb3Igd2hvbSBkaWZmZXJlbmNlIHNjb3JlcyBzeXN0ZW1hdGljYWxseSByYW4gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiB0byB3aGF0IHdhcyBvYnNlcnZlZCBhbW9uZyB0ZWNobm9sb2dpZXMsIHdpdGggcGFydGljaXBhbnRzIGVuZG9yc2luZyBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBNSU5ELiBUYWtlbiB0b2dldGhlciwgdGhlc2Ugb2JzZXJ2YXRpb25zIHN1Z2dlc3QgdGhhdCBhc3ltbWV0cmllcyBpbiBhdHRyaWJ1dGlvbnMgb2YgQk9EWSB2cy4gTUlORCBhcmUgbW9yZSB2YXJpYWJsZSBhY3Jvc3MgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYW5kIG1vcmUgc2Vuc2l0aXZlIHRvIGRpZmZlcmVuY2VzIGluIHRhcmdldCBjaGFyYWN0ZXJz4oCUYW5kLCBieSBleHRlbnNpb24sIHRoYXQgdGhlcmUgaXMgbm8gZ2VuZXJhbCBvciByb2J1c3QgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzLgoKCiMgU3R1ZHkgMjogQ29uY2VwdHVhbCBjaGFuZ2UgYmV0d2VlbiBtaWRkbGUgY2hpbGRob29kICg3LTl5KSBhbmQgYWR1bHRob29kCgpJbiB0aGUgY29udGV4dCBvZiB0aGlzIGRpc3NlcnRhdGlvbiwgU3R1ZHkgMiBzZXJ2ZXMgdG8gcHJvdmlkZSBhbiBpbml0aWFsIGludmVzdGlnYXRpb24gb2YgdGhlIGVhcmxpZXIgb3JnaW5zIG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlLCBmb2N1c2luZyBvbiBtaWRkbGUgY2hpbGRob29kICg3LTl5KS4gSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHdoYXQgdGhpcyBzdHVkeSBjYW4gcmV2ZWFsIGFib3V0IGNoYW5nZXMgaW4gdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbmNlcHR1YWwgdW5pdHMgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGJldHdlZW4gbWlkZGxlIGNoaWxkaG9vZCAoNy05eSkgYW5kIGFkdWx0aG9vZC4KCkluIFN0dWR5IDIsIGByIG5yb3coZDJfYWRfd2lkZSlgIFVTIGFkdWx0cyBhbmQgYHIgbnJvdyhkMl83OV93aWRlKWAgVVMgY2hpbGRyZW4gYmV0d2VlbiB0aGUgYWdlcyBvZiBgciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMilgLWByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgeSkgZWFjaCBhc3Nlc3NlZCBhIHNpbmdsZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDQwIG1lbnRhbCBjYXBhY2l0aWVzLiBUbyBtYWtlIHRoZSBzdHVkeSBhcHByb3ByaWF0ZSBmb3IgY2hpbGRyZW4gaW4gdGhpcyBhZ2UgcmFuZ2UsIHRoZSB3b3JkaW5nIG9mIHNvbWUgdGhlIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGVtcGxveWVkIGluIFN0dWR5IDEgd2FzIG1vZGlmaWVkIHRvIHVzZSBtb3JlIGFnZS1hcHByb3ByaWF0ZSB2b2NhYnVsYXJ5LCBhbmQgcGFydGljaXBhbnRzIHJlc3BvbmRlZCBvbiBhIDMtcG9pbnQgc2NhbGUgKCJubywiIGNvZGVkIGFzIDA7ICJraW5kYSwiIGNvZGVkIGFzIDAuNSwgInllcywiIGNvZGVkIGFzIDEpLiBUaGlzIHN0dWR5IGVtcGxveWVkIHRoZSAiZWRnZSBjYXNlIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCB3aXRoIHBhcnRpY2lwYW50cyByYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3MgZWl0aGVyIGEgYmVldGxlIG9yIGEgcm9ib3QuIChTZWUgQ2hhcHRlciBJSSBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBSZXN1bHRzCgojIyMgQWR1bHRzCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QyX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QyX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyX2FkKQpkMl9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQyX2FkLCBzY2FsZXNfZWZhX3dkbV9kMl9hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDJfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QyX2FkIikKc2F2ZVJEUyhkMl9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDJfYWRfc2NvcmVkX2FkIikKYGBgCgpgYGB7cn0KIyBiaWcgdGFibGUgZm9yIHNjYWxlcyBsb2NhdGVkIGF0IHN0dWR5IDQKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDJfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4xMC4KCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2QyX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQyX2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2QyX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMl9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QyX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMl9hZF9wbG90cywgZmlnX2QyX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDI6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDJfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfYWRfdGl0bGUsIGZpZ19kMl9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QyX2FkX3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjMsIHJvdyBBLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LjMsIHBhbmVsIEExKS4gTXVjaCBhcyBpbiBTdHVkeSAxLCB0aGUgbW9zdCBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSB2ZXJ5IGZldyBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSksIGFuZCBjZXJ0YWlubHkgbm8gZGF0YXBvaW50cyBpbiB0aGUgdXBwZXIgbGVmdCBxdWFkcmFudC4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIG1hbnkgcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24sIGJ1dCB2aXJ0dWFsbHkgbm8gcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIEJPRFkuIEFzIGluIFN0dWRpZXMgMWEtMWMgKHdoaWNoIGFsc28gZmVhdHVyZWQgdGhlc2UgdHdvICJlZGdlIGNhc2VzIiBhcyB0YXJnZXQgY2hhcmFjdGVycyksIHRoaXMgYXN5bW1ldHJ5IGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGRyaXZlbiBwcmltYXJpbHkgYnkgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZSAoaW4gcmVkKSwgcmF0aGVyIHRoYW4gdGhlIHJvYm90IChpbiBibHVlKS4KCiMjIyMjIEJPRFkgdnMuIE1JTkQKCk5leHQgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBNSU5EIChGaWd1cmUgNC4zLCBwYW5lbCBBMikuIEFzIGluIFN0dWR5IDEsIHR3byBub3RhYmxlIGZlYXR1cmVzIG9mIHRoaXMgdmlzdWFsaXphdGlvbiBhcmUgdGhhdCAoMSkgdGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlczsgYW5kICgyKSB0aGVyZSBhcmUgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXQsIGFuZCBubyBkYXRhcG9pbnRzIGluIHRoZSBsb3dlciByaWdodCBxdWFkcmFudC4gTW9zdCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIHJvdWdobHkgYXMgc3Ryb25nbHksIGFuZCBzb21ldGltZXMgbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfQk9EWV8gc2NhbGUsIHdoaWxlIHJlbGF0aXZlbHkgZmV3IHBhcnRpY2lwYW50cyBlbmRvcnNlZCBfTUlORF8gaXRlbXMgbGVzcyBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAodGhvdWdoIHRoaXMgYXN5bW1ldHJ5IGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGxlc3MgZXh0cmVtZSB0aGFuIHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBfQk9EWV8gYW5kIF9IRUFSVF8gc2NvcmVzIGRvY3VtZW50ZWQgaW4gdGhlIHByZXZpb3VzIHBhcmFncmFwaCkuIEFzIGluIHRoZSBCT0RZIHZzLiBNSU5EIGNvbXBhcmlzb24gZm9yIFN0dWRpZXMgMWEtMWMgKHdoaWNoIGFsc28gZmVhdHVyZWQgdGhlc2UgdHdvICJlZGdlIGNhc2VzIiBhcyB0YXJnZXQgY2hhcmFjdGVycyksIHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBfQk9EWV8gYW5kIF9NSU5EXyBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gcHJpbWFyaWx5IGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90IChpbiBibHVlKSwgcmF0aGVyIHRoYW4gdGhlIGJlZXRsZSAoaW4gcmVkKS4gCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5EIChGaWd1cmUgNC4zLCBwYW5lbCBBMSkuIEFzIGluIFN0dWR5IDEsIHRoZSBtb3N0IHN0cmlraW5nIGZlYXR1cmVzIG9mIHRoaXMgdmlzdWFsaXphdGlvbiBhcmUgdGhhdCAoMSkgdGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIHZpcnR1YWxseSBubyBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSksIGFuZCBjZXJ0YWlubHkgbm8gZGF0YXBvaW50cyBpbiB0aGUgbG93ZXIgcmlnaHQgcXVhZHJhbnQuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSBhdCBsZWFzdCBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0hFQVJUXyBzY2FsZeKAlGluIG90aGVyIHdvcmRzLCBtYW55IHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uLCBidXQgdmlydHVhbGx5IG5vIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELiBBcyBpbiB0aGUgSEVBUlQgdnMuIE1JTkQgY29tcGFyaXNvbiBmb3IgU3R1ZGllcyAxYS0xYyAod2hpY2ggYWxzbyBmZWF0dXJlZCB0aGVzZSB0d28gImVkZ2UgY2FzZXMiIGFzIHRhcmdldCBjaGFyYWN0ZXJzKSwgdGhpcyBhc3ltbWV0cnkgYXBwZWFycyB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IGV4dHJlbWU6IEFsbW9zdCBfYWxsXyBwYXJ0aWNpcGFudHMgZW5kb3JzZWQgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIG1vcmUgc3Ryb25nbHkgdGhhbiB0aGUgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGUuIEFnYWluLCB0aGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGJlIGJvcm4gb3V0IGZvciBib3RoIHRhcmdldCBjaGFyYWN0ZXJzLCBidXQgcGVyaGFwcyBtb3JlIGV4YWdnZXJhdGVkIGZvciB0aGUgYmVldGxlIChpbiByZWQpIHRoYW4gdGhlIHJvYm90IChpbiBibHVlKS4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKTXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGFkdWx0cycgZW5kb3JzZW1lbnRzIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIgYXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBmb3IgYWR1bHRzIGluIFN0dWR5IDE6ICgxKSBBbGwgb2YgdGhlc2UgaW50ZXItdW5pdCByZWxhdGlvbnNoaXBzIHdlcmUgcG9zaXRpdmUsIHN1Y2ggdGhhdCB0aGUgbW9yZSBzdHJvbmdseSBhIHBhcnRpY2lwYW50IGVuZG9yc2VkIG9uZSBjb25jZXB0dWFsIHVuaXQsIHRoZSBtb3JlIHN0cm9uZ2x5IHRoZXkgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG90aGVyczsgYW5kICgyKSBUaGVyZSB3ZXJlIHJvYnVzdCBhc3ltbWV0cmllcyBpbiB0aGVzZSBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzLCBzdWNoIHRoYXQgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFkgb3IgSEVBUlQsIGFuZCBIRUFSVCBtb3JlIHN0cm9uZ2x5IHRoYW4gTUlORC4gQXMgaW4gU3R1ZGllcyAxYS0xYywgdmlzdWFsIGluc3BlY3Rpb24gc3VnZ2VzdHMgdGhhdCB0aGVzZSBhc3ltbWV0cmllcyB3ZXJlIG1vc3QgcHJvbm91bmNlZCBmb3IgY29tcGFyaXNvbnMgaW52b2x2aW5nIEhFQVJULCB3aXRoIHZpcnR1YWxseSBldmVyeSBwYXJ0aWNpcGFudCBhY3Jvc3MgYWxsIHRocmVlIG9mIHRoZXNlIHN0dWRpZXMgZW5kb3JzaW5nIGJvdGggQk9EWSBhbmQgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQgZm9yIGJvdGggb2YgdGhlICJlZGdlIGNhc2UiIGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gdGhlc2Ugc3R1ZGllcyAoYSBiZWV0bGUgYW5kIGEgcm9ib3QpLiAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIHRoZSBhc3ltbWV0cmllcyByZXZlYWxlZCBieSB0aGUgdmlzdWFsaXphdGlvbnMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uIEFzIGluIFN0dWRpZXMgMWEtMWMsIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgY29uZHVjdCBhIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgdHdvICJlZGdlIGNhc2VzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gU2VlIEZpZ3VyZSA0LjUsIHBhbmVsIEQsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkMl9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkMl9hZF9zY29yZWRfYWQpCmNvbnRyYXN0cyhkMl9hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMl9hZF9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QyX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMl9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDJfYWRfc2NvcmVkX2FkX2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJBZHVsdHMiLAogIGNoYXJfbGFiZWwgPSAiUm9ib3QgdnMuIEdNIikKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDJfYWRfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgaW4gU3R1ZHkgMSwgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDIsIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KS4gQXMgSSBzcGVjdWxhdGVkIGVhcmxpZXIsIHRoaXMgZGlmZmVyZW5jZSB3YXMgZHJpdmVuIGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZTsgaW4gdGhlIGFnZ3JlZ2F0ZSwgZGlmZmVyZW5jZSBzY29yZXMgd2VyZSByZWR1Y2VkIHRvIDAgZm9yIHRoZSByb2JvdCAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpBcyBpbiBTdHVkaWVzIDFhLTFjICh3aGljaCBmZWF0dXJlZCB0aGUgc2FtZSAiZWRnZSBjYXNlcyIgYXMgdGFyZ2V0IGNoYXJhY3RlcnMpLCBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgMiwgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLiBUaGlzIGRpZmZlcmVuY2Ugd2FzIGRyaXZlbiBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdDsgaW4gdGhlIGFnZ3JlZ2F0ZSwgZGlmZmVyZW5jZSBzY29yZXMgd2VyZSByZWR1Y2VkIHRvIDAgZm9yIHRoZSBiZWV0bGUgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkFzIGluIFN0dWR5IDEsIGFtb25nIGFkdWx0cyBpbiBTdHVkeSAyLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNCkuIEFzIGluIFN0dWRpZXMgMWEtMWMsIHRoaXMgZGlmZmVyZW5jZSB3YXMgc29tZXdoYXQgZXhhZ2dlcmF0ZWQgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90LCByZWxhdGl2ZSB0byB0aGUgYmVldGxlIChzZWUgdGhlICJSb2JvdCB2cy4gR00iIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNCkuCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClRoZXNlIGZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDIgY29uZmlybSBteSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgb2YgYXN5bW1ldHJpZXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBhbmQgYWxpZ24gcXVpdGUgY2xvc2VseSB3aXRoIGFuYWx5c2VzIG9mIGFkdWx0cyBpbiBTdHVkaWVzIDFhLTFjOiBBY3Jvc3MgYWxsIG9mIHRoZXNlIHN0dWRpZXMsIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIG9yIEhFQVJULCBhbmQgQk9EWSBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuCgojIyMgQ2hpbGRyZW4gKDctOXkpCgpgYGB7cn0KZDJfNzlfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkMl83OSwgc2NhbGVzX2VmYV93ZG1fZDJfYWQpCnNhdmVSRFMoZDJfNzlfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QyXzc5X3Njb3JlZF9hZCIpCmBgYAoKWFggX19JTlNFUlQgU0VDVElPTiBJTlRST0RVQ1RJT04vVFJBTlNJVElPTl9fCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpwbG90c19kMl83OV9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMl83OV9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ19kMl83OV9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDJfNzlfc2NvcmVkX2FkW1sxXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kMl83OV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kMl83OV9zY29yZWRfYWRbWzFdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDJfNzlfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfcGxvdHMsIGZpZ19kMl83OV9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDJfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDJfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfdGl0bGUsIGZpZ19kMl83OV9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QyXzc5X3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjMsIHJvdyBCLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LjMsIHBhbmVsIEIxKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEExKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyBhcHBlYXJzIHRvIGJlIHNvbWV3aGF0IHBvc2l0aXZlLCBhbmQgdGhlcmUgYXBwZWFyIHRvIGJlIHNvbWV3aGF0IGZld2VyIGRhdGFwb2ludHMgYWJvdmUgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGJlbG93IGl04oCUYnV0IGJvdGggb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIGFyZSBtdWNoIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiB0aGV5IHdlcmUgYW1vbmcgYWR1bHRzLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUgbWFueSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIEJPRFkuIEZ1cnRoZXJtb3JlLCBhIHZpc3VhbCBpbnNwZWN0aW9uIG9mIHRoaXMgcGxvdCBzdWdnZXN0cyB0aGF0IHRoZSBhc3ltbWV0cnkgbWF5IGhhdmUgZXZlbiBnb25lIGluIG9wcG9zaXRlIGRpcmVjdGlvbnMgZm9yIHRoZSB0d28gdGFyZ2V0IGNoYXJhY3RlcnMsIHdpdGggY2hpbGRyZW4gdGVuZGluZyB0byBhdHRyaWJ1dGUgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIGJlZXRsZSAoaW4gcmVkKSBidXQsIGlmIGFueXRoaW5nLCBtb3JlIEhFQVJUIHRoYW4gQk9EWSB0byB0aGUgcm9ib3QgKGluIGJsdWUpLgoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjMsIHBhbmVsIEIyKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEEyKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQsIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gTUlORC4gRnVydGhlcm1vcmUsIGEgdmlzdWFsIGluc3BlY3Rpb24gb2YgdGhpcyBwbG90IHN1Z2dlc3RzIHRoYXQgdGhlIGFzeW1tZXRyeSBtYXkgaGF2ZSBldmVuIGdvbmUgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyBmb3IgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycywgd2l0aCBjaGlsZHJlbiB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSByb2JvdCAoaW4gYmx1ZSkgYnV0LCBpZiBhbnl0aGluZywgbW9yZSBCT0RZIHRoYW4gTUlORCB0byB0aGUgYmVldGxlIChpbiByZWQpLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkZpbmFsbHkgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQuMywgcGFuZWwgQjMpLiBBcyBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeSAocGFuZWwgQTMpLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQsIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9ucywgYm90aCBvZiB0aGVzZSBvYnNlcnZhdGlvbnMgYXJlIG11Y2ggbGVzcyBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiB0aGFuIHRoZXkgd2VyZSBhbW9uZyBhZHVsdHMuIEluIG90aGVyIHdvcmRzLCB3aGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gTUlORC4gVGhpcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiB0cnVlIGZvciBib3RoIHRhcmdldCBjaGFyYWN0ZXJzLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpNeSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2hpbGRyZW4ncyBlbmRvcnNlbWVudHMgb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiBhcmUgZ2VuZXJhbGx5IHNpbWlsYXIgdG8gdGhvc2Ugb2YgYWR1bHRzIGluIHRoaXMgc3R1ZHksIGJ1dCBkcmFtYXRpY2FsbHkgYXR0ZW51YXRlZDogKDEpIEFsbCBvZiB0aGVzZSBpbnRlci11bml0IHJlbGF0aW9uc2hpcHMgd2VyZSBzb21ld2hhdCBwb3NpdGl2ZSwgYnV0IG9ubHkgc29tZXdoYXQ7IGFuZCAoMikgVGhlcmUgd2FzIHNvbWUgZXZpZGVuY2Ugb2YgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgYnV0IHRoZXNlIGFzeW1tZXRyaWVzIHdlcmUgZ2VuZXJhbGx5IHdlYWtlciBhbmQgYXBwZWFyZWQgdG8gYmUgaGlnaGx5IGRlcGVuZGVudCBvbiB3aGljaCB0YXJnZXQgY2hhcmFjdGVyIHBhcnRpY2lwYW50cyBhc3Nlc3NlZCAocGFydGljdWxhcmx5IGZvciB0aGUgQk9EWSB2cy4gSEVBUlQgYW5kIEJPRFkgdnMuIE1JTkQgY29tcGFyaXNvbnMpLgoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gQXMgaW4gcHJldmlvdXMgYW5hbHlzZXMsIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgY29uZHVjdCBhIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgdHdvICJlZGdlIGNhc2VzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcyAoYmVldGxlIGFuZCByb2JvdCkuIFNlZSBGaWd1cmUgNC41LCBwYW5lbCBCLCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMuCgpgYGB7cn0KZDJfNzlfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDJfNzlfc2NvcmVkX2FkKQpjb250cmFzdHMoZDJfNzlfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDJfNzlfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMl83OV9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDJfNzlfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQyXzc5X3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMl83OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMl83OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lCiAgc2VsZWN0KC1zdHVkeSwgLXMuZS4pICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9kMl83OV9zY29yZWRfYWRfZGlmZgpgYGAKCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpJbiBjb250cmFzdCB0byBhbmFseXNlcyBvZiBhZHVsdHMsIGFtb25nIGNoaWxkcmVuIGluIFN0dWR5IDIgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgbm90IGRpZmZlcmVudGlhYmxlIGZyb20gemVybyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLCBhbmQgdGhlIGRpcmVjdGlvbiBvZiBkaWZmZXJlbmNlIHZhcmllZCBzdWJzdGFudGlhbGx5IGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycyAoc2VlIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KS4gIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKQXMgYW1vbmcgYWR1bHRzLCBhbW9uZyBjaGlsZHJlbiBpbiBTdHVkeSAyIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSwgaW4gdGhlIGRpcmVjdGlvbiBvZiBjaGlsZHJlbiBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLCBhbmQgdGhpcyBkaWZmZXJlbmNlIHdhcyBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgKHNlZSB0aGUgdmFyaW91cyBjb21wYXJpc29ucyBvZiB0YXJnZXQgY2hhcmFjdGVycyB0byB0aGUgZ3JhbmQgbWVhbiBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KS4gIAoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkFzIGFtb25nIGFkdWx0cywgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDIgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLCBhbmQgdGhpcyBkaWZmZXJlbmNlIHdhcyBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3Qoc2VlIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KS4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhbW9uZyBjaGlsZHJlbiBpbiBTdHVkeSAyIGNvbmZpcm0gbXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIHRoYXQgY2hpbGRyZW4gZ2VuZXJhbGx5IHNob3dlZCBzaW1pbGFyIHBhdHRlcm5zIG9mIGFzeW1tZXRyaWVzIHRvIGFkdWx0c+KAlHdpdGggdGhlIG5vdGFibGUgZXhjZXB0aW9uIG9mIHRoZSBCT0RZIHZzLiBIRUFSVCBjb21wYXJpc29uLCBpbiB3aGljaCBjaGlsZHJlbidzIHJlc3BvbnNlcyByZXZlYWxlZCBubyBjb25zaXN0ZW50IGFzeW1tZXRyeS4gSW4gb3RoZXIgd29yZHMsIGNoaWxkcmVuLCBsaWtlIGFkdWx0cywgdGVuZGVkIHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSBvciBIRUFSVCwgYnV0IGRpZCBub3Qgc2hvdyBhIHJvYnVzdCBhZHVsdC1saWtlIHRlbmRlbmN5IHRvIGVuZG9yc2UgQk9EWSBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIAoKYGBge3J9CnBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZCA8LSByZWx2aXpfYWdlZ3BfZnVuKAogIGRfc2NvcmVkID0gZDJfYWRfc2NvcmVkX2FkICU+JSAKICAgIGZ1bGxfam9pbihkMl83OV9zY29yZWRfYWQpLCAKICBhZ2VfZ3JvdXBzID0gYygiY2hpbGRyZW43OSIsICJhZHVsdHMiKSwKICBhZ2VfZ3JvdXBfbGFiZWxzID0gYygiQ2hpbGRyZW4gKDctOXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDJfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQzEiLCAiQzIiLCAiQzMiKSwgbmNvbCA9IDMpCgpmaWdfZDJfYWxsX3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudHJhbnNsYXRlID0gRiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2QyX2FsbF9zY29yZWRfYWRfcGxvdHMsIGZpZ19kMl9hbGxfc2NvcmVkX2FkX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QyX2FsbF9zY29yZWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJUcmFja2luZyBkZXZlbG9wbWVudCBiZXR3ZWVuIDctOXkgYW5kIGFkdWx0aG9vZCAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kMl9hbGxfc2NvcmVkX2FkX3RpdGxlLCBmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KZmlndXJlNC4zIDwtIHBsb3RfZ3JpZChmaWdfZDJfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDJfNzlfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQuM19jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjMsIHN0cl93cmFwKCJGaWd1cmUgNC4zOiBSZWxhdGlvbnNoaXBzIGFtb25nIFVTIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiwgc2NvcmVkIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAoc2VlIFRhYmxlIDQuMTApLiBQbG90cyBhcmUgb3JnYW5pemVkIGJ5IHNhbXBsZSAocm93cykgYW5kIGJ5IHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoY29sdW1ucykuIChBKSBBZHVsdHMuIChCKSBDaGlsZHJlbiAoNy05eSBvZiBhZ2UpLCBzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMuIChDKSBBIHZpc3VhbGl6YXRpb24gb2YgZGV2ZWxvcG1lbnQgYmV0d2VlbiA3LTl5IGFuZCBhZHVsdGhvb2QsIHVzaW5nIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhbmQgYWdlIGdyb3VwLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW4gcGFuZWxzIEEtQiwgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4gUGVhcnNvbiBjb3JyZWxhdGlvbnMgYXJlIHJlcG9ydGVkIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cy4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuNH0KZ2dkcmF3KGZpZ3VyZTQuM19jYXApCmBgYAoKIyMjIERldmVsb3BtZW50YWwgY29tcGFyaXNvbgoKSW4gdGhlIHByZXZpb3VzIHNlY3Rpb25zLCBJIGFuYWx5emVkIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIHNlcGFyYXRlbHkuIEhlcmUgSSBjb25kdWN0IGEgZm9ybWFsIGNvbXBhcmlzb24gb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIGFtb25nIHRoZXNlIHR3byBhZ2UgZ3JvdXBzLCB0byBhc3Nlc3MgdGhlIHNpemUgYW5kIHJvYnVzdG5lc3Mgb2YgdGhlc2Ugb3N0ZW5zaXZlIGRldmVsb3BtZW50YWwgZGlmZmVyZW5jZXMuCgpgYGB7cn0KZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiA8LSBmdWxsX2pvaW4oZDJfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCkpCmNvbnRyYXN0cyhkMl9hZDc5X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9lZGdlCmNvbnRyYXN0cyhkMl9hZDc5X3Njb3JlZF9hZF9kaWZmJGFnZV9ncm91cCkgPC0gY29udHJhc3RzX2R1bTJfYWdlZ3AKYGBgCgpgYGB7cn0KIyByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCwKIyAgIGRhdGEgPSBkMl9hZDc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksIAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQyX2FkNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLCAKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQyX2FkNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwgCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIsIAogIGFnZWdwX2xhYmVsID0gIkNoaWxkcmVuIHZzLiBhZHVsdHMiKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtICVpbiUgYygiQ2hpbGRyZW4gdnMuIGFkdWx0cyIsICJJbnRlcmFjdGlvbiIpKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2dyaWQocGxvdF9kMl9hZF9zY29yZWRfYWRfZGlmZiwgcGxvdF9kMl83OV9zY29yZWRfYWRfZGlmZiwgbmNvbCA9IDIpCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IGNsb3NlciB0byB6ZXJvIGFtb25nIGNoaWxkcmVuLCBhcyBjb21wYXJlZCB0byBhZHVsdHMgKHNlZSB0aGUgIkNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNSkuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgZGlkIG5vdCBkaWZmZXIgc3Vic3RhbnRpYWxseSBhY3Jvc3MgYWdlIGdyb3VwcyAoc2VlIHRoZSAiSW50ZXJhY3Rpb24iIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNSkuICAKCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY2xvc2VyIHRvIHplcm8gYW1vbmcgY2hpbGRyZW4sIGFzIGNvbXBhcmVkIHRvIGFkdWx0cyAoc2VlIHRoZSAiQ2hpbGRyZW4gdnMuIGFkdWx0cyIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjUpLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyB3YXMgYXR0ZW51YXRlZCBhbW9uZyBjaGlsZHJlbiAoc2VlIHRoZSAiSW50ZXJhY3Rpb24iIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC41KS4gIAoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IGNsb3NlciB0byB6ZXJvIGFtb25nIGNoaWxkcmVuLCBhcyBjb21wYXJlZCB0byBhZHVsdHMgKHNlZSB0aGUgIkNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNSksIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgZGlkIG5vdCBkaWZmZXIgc3Vic3RhbnRpYWxseSBhY3Jvc3MgYWdlIGdyb3VwcyAoc2VlIHRoZSAiSW50ZXJhY3Rpb24iIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNSkuICAKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGNvbXBhcmlzb25zIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIGNoaWxkcmVuIHZzLiBhZHVsdHMgaW4gU3R1ZHkgMiBjb25maXJtIG15IGVhcmxpZXIgb2JzZXJ2YXRpb25zIHRoYXQgYXN5bW1ldHJpZXMgd2VyZSBzdWJzdGFudGlhbGx5IGF0dGVudWF0ZWQgKGFuZCBpbiBzb21lIGNhc2VzLCByZWR1Y2VkIHRvIHplcm8pIGFtb25nIGNoaWxkcmVuLCByZWxhdGl2ZSB0byB0aGUgYmFzZWxpbmUgc2V0IGJ5IGFkdWx0cy4gSW4gYWRkaXRpb24sIGFtb25nIGNoaWxkcmVuIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGVzZSBhc3ltbWV0cmllcyBiZXR3ZWVuIHRoZSB0d28gImVkZ2UgY2FzZXMiIGluY2x1ZGVkIGluIHRoaXMgc3R1ZHkgKHRoZSBiZWV0bGUgdnMuIHRoZSByb2JvdCkgd2VyZSBhbHNvIGF0dGVudWF0ZWQsIHJlbGF0aXZlIHRvIGFkdWx0czsgdGhpcyBpcyBpbiBsaW5lIHdpdGggbXkgZWFybGllciwgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIHRoYXQgdGhlc2UgYXN5bW1ldHJpZXMgc29tZXRpbWVzIGFwcGVhcmVkIHRvIHJldmVyc2UgaW4gZGlyZWN0aW9uIGFjcm9zcyB0aGUgdHdvIHRhcmdldCBjaGFyYWN0ZXJzLiAKCiMjIyBDaGlsZHJlbiAoNy05eSksIHVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcwoKWFggX19JTlNFUlQgVFJBTlNJVElPTl9fCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QyXzc5IDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QyXzc5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyXzc5KQpkMl83OV9zY29yZWRfNzkgPC0gc2NvcmVfZnVuKGQyXzc5LCBzY2FsZXNfZWZhX3dkbV9kMl83OSkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDJfNzksIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QyXzc5IikKc2F2ZVJEUyhkMl83OV9zY29yZWRfNzksIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDJfNzlfc2NvcmVkXzc5IikKYGBgCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MiA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDJfYWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJBZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDJfNzkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJDaGlsZHJlbiwgNy05eSIpKSAlPiUKICBzZWxlY3QoLWMobG9hZGluZywgb3JkZXIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHNwcmVhZChzdHVkeSwgZmFjdG9yKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gaWZlbHNlKCFpcy5uYShgQWR1bHRzYCksIGBBZHVsdHNgLCBgQ2hpbGRyZW4sIDctOXlgKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QyX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDJfNzkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfNzkgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNzkpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yKSAjICU+JQojIHNlbGVjdCgtc3RhcnRzX3dpdGgoIm9yZGVyIikpCmBgYAoKYGBge3J9CiMgYmlnIHRhYmxlIGZvciBzY2FsZXMgbG9jYXRlZCBhdCBzdHVkeSA0CmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gdGhlICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyXzc5KWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QyXzc5ICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMTAuCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpwbG90c19kMl83OV9zY29yZWRfNzkgPC0gcmVsdml6X2Z1bihkMl83OV9zY29yZWRfNzkpCmBgYAoKYGBge3J9CmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfNzlbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDJfNzlfc2NvcmVkXzc5X2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfNzlfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl83OV9zY29yZWRfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjQuCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKRmlyc3QgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBIRUFSVCAoRmlndXJlIDQuNCwgcGFuZWwgQTEpLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBhYm92ZSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYmVsb3cgaXTigJRidXQgYm90aCBvZiB0aGVzZSBvYnNlcnZhdGlvbnMgYXJlIG11Y2ggbGVzcyBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiB0aGFuIHRoZXkgd2VyZSBhbW9uZyBhZHVsdHMuIEluIG90aGVyIHdvcmRzLCB3aGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWS4gRnVydGhlcm1vcmUsIGEgdmlzdWFsIGluc3BlY3Rpb24gb2YgdGhpcyBwbG90IHN1Z2dlc3RzIHRoYXQgdGhlIGFzeW1tZXRyeSBtYXkgaGF2ZSBldmVuIGdvbmUgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyBmb3IgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycywgd2l0aCBjaGlsZHJlbiB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgYmVldGxlIChpbiByZWQpIGJ1dCwgaWYgYW55dGhpbmcsIG1vcmUgSEVBUlQgdGhhbiBCT0RZIHRvIHRoZSByb2JvdCAoaW4gYmx1ZSkuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpOZXh0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgTUlORCAoRmlndXJlIDQuNCwgcGFuZWwgQTIpLiBUdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQsIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gTUlORC4gRnVydGhlcm1vcmUsIGEgdmlzdWFsIGluc3BlY3Rpb24gb2YgdGhpcyBwbG90IHN1Z2dlc3RzIHRoYXQgdGhlIGFzeW1tZXRyeSBtYXkgaGF2ZSBldmVuIGdvbmUgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyBmb3IgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycywgd2l0aCBjaGlsZHJlbiB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSByb2JvdCAoaW4gYmx1ZSkgYnV0LCBpZiBhbnl0aGluZywgbW9yZSBCT0RZIHRoYW4gTUlORCB0byB0aGUgYmVldGxlIChpbiByZWQpLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkZpbmFsbHkgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQuNCwgcGFuZWwgQTMpLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQsIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9ucywgYm90aCBvZiB0aGVzZSBvYnNlcnZhdGlvbnMgYXJlIG11Y2ggbGVzcyBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiB0aGFuIHRoZXkgd2VyZSBhbW9uZyBhZHVsdHMuIEluIG90aGVyIHdvcmRzLCB3aGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gTUlORC4gVGhpcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiB0cnVlIGZvciBib3RoIHRhcmdldCBjaGFyYWN0ZXJzLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpNeSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2hpbGRyZW4ncyBlbmRvcnNlbWVudHMgb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMuKAlGFzIGluZGV4ZWQgYnkgdGhlaXIgb3duIHNjYWxlc+KAlGFyZSBnZW5lcmFsbHkgc2ltaWxhciB0byB0aG9zZSBvZiBhZHVsdHMgaW4gdGhpcyBzdHVkeSwgYnV0IGRyYW1hdGljYWxseSBhdHRlbnVhdGVkOiAoMSkgQWxsIG9mIHRoZXNlIGludGVyLXVuaXQgcmVsYXRpb25zaGlwcyB3ZXJlIHNvbWV3aGF0IHBvc2l0aXZlLCBidXQgb25seSBzb21ld2hhdDsgYW5kICgyKSBUaGVyZSB3YXMgc29tZSBldmlkZW5jZSBvZiBhc3ltbWV0cmllcyBpbiB0aGVzZSBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzLCBidXQgdGhlc2UgYXN5bW1ldHJpZXMgd2VyZSBnZW5lcmFsbHkgd2Vha2VyIGFuZCBhcHBlYXJlZCB0byBiZSBoaWdobHkgZGVwZW5kZW50IG9uIHdoaWNoIHRhcmdldCBjaGFyYWN0ZXIgcGFydGljaXBhbnRzIGFzc2Vzc2VkIChwYXJ0aWN1bGFybHkgZm9yIHRoZSBCT0RZIHZzLiBIRUFSVCBhbmQgQk9EWSB2cy4gTUlORCBjb21wYXJpc29ucykuCgpgYGB7cn0KZmlndXJlNC40IDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjRfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC40LCBzdHJfd3JhcCgiRmlndXJlIDQuNDogUmVsYXRpb25zaGlwcyBhbW9uZyBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIsIHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzIChzZWUgVGFibGUgNC4xMCkuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIFBlYXJzb24gY29ycmVsYXRpb25zIGFyZSByZXBvcnRlZCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjU1fQpnZ2RyYXcoZmlndXJlNC40X2NhcCkKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGUgYXN5bW1ldHJpZXMgcmV2ZWFsZWQgYnkgdGhlIHZpc3VhbGl6YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBBcyBpbiBwcmV2aW91cyBhbmFseXNlcywgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKSwgSSBjb25kdWN0IGEgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSB0d28gImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzIChiZWV0bGUgYW5kIHJvYm90KS4gU2VlIEZpZ3VyZSA0LjUsIHBhbmVsIEMsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkMl83OV9zY29yZWRfNzlfZGlmZiA8LSBkaWZmX2Z1bihkMl83OV9zY29yZWRfNzkpCmNvbnRyYXN0cyhkMl83OV9zY29yZWRfNzlfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMl83OV9zY29yZWRfNzlfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QyXzc5X3Njb3JlZF83OV9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMl83OV9zY29yZWRfNzlfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDJfNzlfc2NvcmVkXzc5X2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQiKQoKcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMl83OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QyXzc5X3Njb3JlZF83OV9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMl83OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNy05eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcykiLAogIGNoYXJfbGFiZWwgPSAiUm9ib3QgdnMuIEdNIikKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QyXzc5X3Njb3JlZF83OV9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDJfNzlfc2NvcmVkXzc5X2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgaW4gYW5hbHlzZXMgdXNpbmcgYWR1bHRzJyBzY2FsZXMsIHVzaW5nIGNoaWxkcmVuJ3Mgb3duIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgdG8gYW5hbHl6ZSB0aGVpciBkYXRhIHJldmVhbGVkIHRoYXQgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIHdlcmUgbm90IGRpZmZlcmVudGlhYmxlIGZyb20gemVybyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjUpLCBhbmQgdGhlIGRpcmVjdGlvbiBvZiBkaWZmZXJlbmNlIHZhcmllZCBzdWJzdGFudGlhbGx5IGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycyAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjUpLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpBcyBpbiBhbmFseXNlcyB1c2luZyBhZHVsdHMnIHNjYWxlcywgdXNpbmcgY2hpbGRyZW4ncyBvd24gX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHRvIGFuYWx5emUgdGhlaXIgZGF0YSByZXZlYWxlZCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgY29uY2VwdHVhbCB1bml0cyBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIGNoaWxkcmVuIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNSksIGFuZCB0aGlzIGRpZmZlcmVuY2Ugd2FzIGV4YWdnZXJhdGVkIGluIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNSkuICAKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpBcyBpbiBhbmFseXNlcyB1c2luZyBhZHVsdHMnIHNjYWxlcywgdXNpbmcgY2hpbGRyZW4ncyBvd24gX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB0byBhbmFseXplIHRoZWlyIGRhdGEgcmV2ZWFsZWQgdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBjaGlsZHJlbiBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNSksIGFuZCB0aGlzIGRpZmZlcmVuY2Ugd2FzIGV4YWdnZXJhdGVkIGluIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjUpLiAgCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClVzaW5nIGNoaWxkcmVuJ3Mgb3duIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgdG8gYXNzZXNzIGFzeW1tZXRyaWVzIGluIHRoZWlyIGVuZG9yc2VtZW50cyBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIHJldmVhbGVkIHRoZSBzYW1lIHBhdHRlcm4gb2YgcmVzdWx0cyBvYnRhaW5lZCB3aGVuIHVzaW5nIGFkdWx0cycgc2NhbGVzOiBDaGlsZHJlbiBnZW5lcmFsbHkgc2hvd2VkIHNpbWlsYXIgcGF0dGVybnMgb2YgYXN5bW1ldHJpZXMgdG8gYWR1bHRzLCB3aXRoIHRoZSBub3RhYmxlIGV4Y2VwdGlvbiBvZiB0aGUgQk9EWSB2cy4gSEVBUlQgY29tcGFyaXNvbiwgaW4gd2hpY2ggY2hpbGRyZW4ncyByZXNwb25zZXMgcmV2ZWFsZWQgbm8gY29uc2lzdGVudCBhc3ltbWV0cnkuIEluIG90aGVyIHdvcmRzLCBjaGlsZHJlbiwgbGlrZSBhZHVsdHMsIHRlbmRlZCB0byBlbmRvcnNlIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFkgb3IgSEVBUlQsIGJ1dCBkaWQgbm90IHNob3cgYSByb2J1c3QgYWR1bHQtbGlrZSB0ZW5kZW5jeSB0byBlbmRvcnNlIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJU4oCUcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgd2VyZSBpbmRleGVkIGJ5IHNjYWxlcyBkZXNpZ25lZCB0byBjYXB0dXJlIGFkdWx0cycgb3IgY2hpbGRyZW4ncyBjb25zdHJ1YWxzIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORC4gCgpgYGB7cn0KZmlndXJlNC41X3Bsb3RzIDwtIHBsb3RfZ3JpZCgKICBwbG90X2QyX2FkX3Njb3JlZF9hZF9kaWZmICsKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMjogQWR1bHRzIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLAogIHBsb3RfZDJfNzlfc2NvcmVkX2FkX2RpZmYgKwogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwKICBwbG90X2QyXzc5X3Njb3JlZF83OV9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDI6IENoaWxkcmVuLCA0LTZ5IChzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcykiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIAogIG5jb2wgPSAzLCByZWxfd2lkdGhzID0gYygxLCAxLCAxKSwKICBsYWJlbHMgPSAiQVVUTyIpCgpmaWd1cmU0LjVfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC41X3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIDQuNTogRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBVUyBhZHVsdHMnIGFuZCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIuIHRoaXMgaW5jbHVkZXMgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgYWR1bHRzJyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NhbGVzIChwYW5lbCBCKSBhbmQgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzIChwYW5lbCBDOyBzZWUgVGFibGUgNC4xMCkuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLCBzdWNoIHRoYXQgZGlmZmVyZW5jZSBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAtMSB0byArMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkIChpLmUuLCBhIGRpZmZlcmVuY2Ugc2NvcmUgb2YgMCkuIiwgMTgwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjM4fQpnZ2RyYXcoZmlndXJlNC41X2NhcCkKYGBgCgojIyBEaXNjdXNzaW9uCgpYWCBfX0lOU0VSVCBTVFVEWSAyIERJU0NVU1NJT05fXwoKYGBge3J9CnJlZ3RhYl9zdHVkeTIgPC0gcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDJfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDJfNzlfc2NvcmVkXzc5X2RpZmYpICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgQWR1bHRzYCwgYygiczJhX2IiLCAiczJhX3MuZS4iLCAiczJhXzk1JSBDSSIsICJzMmFfbnoiKSwgc2VwID0gIl8iKSAlPiUKICBzZXBhcmF0ZShgQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKWAsIGMoInMyYl9iIiwgInMyYl9zLmUuIiwgInMyYl85NSUgQ0kiLCAiczJiX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYENoaWxkcmVuLCA3LTl5ICh1c2luZyB0aGVpciBvd24gc2NhbGVzKWAsIGMoInMyY19iIiwgInMyY19zLmUuIiwgInMyY185NSUgQ0kiLCAiczJjX256IiksIHNlcCA9ICJfIikKYGBgCgpgYGB7cn0KdGFibGU0LjQgPC0gcmVndGFiX3N0dWR5MiAlPiUKICBzZWxlY3QoLXBhaXIsIC1jb250YWlucygicy5lLiIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0pICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJueiIsICIgIiwgLikpKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigiczIuXyIsICIiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjQ6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYW1vbmcgVVMgYWR1bHRzIGFuZCBjaGlsZHJlbiAoNy05eSBvZiBhZ2UpIGluIFN0dWR5IDIuIFhYIEFERCBJTkZPIFJFIENISUxEUkVOLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gVGhlIGludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMSwgMywgNSksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCAyKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gTUlORCIsIDMsIDQpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDUsIDYpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiQWR1bHRzIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNy05eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcykiID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQuNApgYGAKCmBgYHtyfQp0YWJsZTQuNSA8LSByZWd0YWJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXBhaXIsIC1zdHVkeSwgLWNvbnRhaW5zKCJzLmUuIikpICU+JQogIG11dGF0ZShiID0gZm9ybWF0KHJvdW5kKGIsIDIpLCBuc21hbGwgPSAyKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtLAogICAgICAgICBgOTUlIENJYCA9IENJOTUpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJub256ZXJvIiwgIiAiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjU6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZXMgaW4gZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBVUyBhZHVsdHMgYW5kIGNoaWxkcmVuICg3LTl5IG9mIGFnZSkgZGlmZmVyZW5jZSBzY29yZXMgaW4gU3R1ZHkgMi4gVGhlIHRhYmxlIHByZXNlbnRzIHJlc3VsdHMgZnJvbSBzZXBhcmF0ZSBCYXllc2lhbiByZWdyZXNzaW9ucyBvZiBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCkuIEVhY2ggcmVncmVzc2lvbiBpbmNsdWRlZCBmb3VyIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCAoZm9yIGFkdWx0cyksIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uIGFtb25nIGFkdWx0czsgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIChhbW9uZyBhZHVsdHMpLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKTsgKDMpIHRoZSBvdmVyYWxsIGRpZmZlcmVuY2UgYmV0d2VlbiBjaGlsZHJlbiBhbmQgYWR1bHRzIChjb2xsYXBzaW5nIGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycyk7IGFuZCAoNCkgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcyBhZ2UgZGlmZmVyZW5jZSBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycy4gVGhlIGRldmVsb3BtZW50YWwgY29tcGFyaXNvbnMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKHNlcSgyLCAxMiwgMiksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCA0KSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gTUlORCIsIDUsIDgpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDksIDEyKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgIkRldmVsb3BtZW50YWwgY29tcGFyaXNvbiIgPSAzKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC41CmBgYAoKCiMgU3R1ZHkgMzogQ29uY2VwdHVhbCBjaGFuZ2Ugb3ZlciBlYXJseSBhbmQgbWlkZGxlIGNoaWxkaG9vZCAoNC05eSkKCkluIHRoZSBjb250ZXh0IG9mIHRoaXMgZGlzc2VydGF0aW9uLCBTdHVkeSAzIHNlcnZlcyB0byBwcm92aWRlIGEgY29uY2VwdHVhbCByZXBsaWNhdGlvbiBvZiB0aGUgaW52ZXN0aWdhdGlvbiBvZiBtaWRkbGUgY2hpbGRob29kICg3LTl5KSBpbml0aWF0ZWQgaW4gU3R1ZHkgMiwgYXMgd2VsbCBhcyBhbiBleHRlbnNpb24gb2YgdGhpcyBleHBsb3JhdGlvbiBvZiBkZXZlbG9wbWVudGFsIGNoYW5nZSBpbnRvIGVhcmxpZXIgY2hpbGRob29kICg0LTZ5KS4gSW4gdGhpcyBjaGFwdGVyLCBJIGFnYWluIGZvY3VzIG9uIHdoYXQgdGhpcyBzdHVkeSBjYW4gcmV2ZWFsIGFib3V0IGNoYW5nZXMgaW4gdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbmNlcHR1YWwgdW5pdHMgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIG92ZXIgdGhlIGNvdXJzZSBvZiBlYXJseSBhbmQgbWlkZGxlIGNoaWxkaG9vZCAoNy05eSksIGNvbXBhcmVkIHRvIGFkdWx0aG9vZC4gQXMgYSByZW1pbmRlciwgaW4gdGhpcyBjaGFwdGVyIEkgYW5hbHl6ZSBjaGlsZHJlbidzIHJlc3BvbnNlcyB3aXRoIHJlc3BlY3QgdG8gdGhlICJtYXR1cmUiIGNvbmNlcHR1YWwgdW5pdHMgQk9EWSwgSEVBUlQsIGFuZCBNSU5ELCBhcyBkZWZpbmVkIGJ5IEVGQSBvZiBfYWR1bHRzJ18gcmVzcG9uc2VzIChzZWUgW1hYIEFQUEVORElYIEI/XSBmb3IgZnVydGhlciBhbmFseXNlcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbmNlcHR1YWwgdW5pdHMgaWRlbnRpZmllZCB0aHJvdWdoIEVGQSBvZiBjaGlsZHJlbidzIG93biBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zLCBhcyBwcmVzZW50ZWQgaW4gQ2hhcHRlciBJSUkpLgoKSW4gU3R1ZHkgMywgYHIgbnJvdyhkM19hZF93aWRlKWAgVVMgYWR1bHRzLCBgciBucm93KGQzXzc5X3dpZGUpYCAib2xkZXIiIGNoaWxkcmVuIChgciBzdW1tYXJ5KGQzXzc5JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMilgLWByIHN1bW1hcnkoZDNfNzkkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKWAgeWVhcnM7IG1lZGlhbjogYHIgc3VtbWFyeShkM183OSRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgeSksIGFuZCBgciBucm93KGQzXzQ2X3dpZGUpYCAieW91bmdlciIgY2hpbGRyZW4gKGByIHN1bW1hcnkoZDNfNDYkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKWAtYHIgc3VtbWFyeShkM180NiRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpYCB5ZWFyczsgbWVkaWFuOiBgciBzdW1tYXJ5KGQzXzQ2JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKWB5KSBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gMjAgbWVudGFsIGNhcGFjaXRpZXMuIFRvIG1ha2UgdGhlIHN0dWR5IGFwcHJvcHJpYXRlIGZvciBjaGlsZHJlbiBpbiB0aGlzIGFnZSByYW5nZSwgcGFydGljaXBhbnRzIGFzc2Vzc2VkIGEgc3Vic2V0IG9mIHRoZSA0MCBtZW50YWwgY2FwYWNpdGllcyBlbXBsb3llZCBpbiBTdHVkeSAyLCBjaG9zZW4gdG8gcmVwcmVzZW50IHRoZSB0aHJlZSAiY29uY2VwdHVhbCB1bml0cyIgcmV2ZWFsZWQgYnkgU3R1ZGllcyAxLTIgKEJPRFksIEhFQVJULCBhbmQgTUlORCkgYW5kIHRvIGNvdmVyIGEgc2ltaWxhciByYW5nZSBvZiBtZW50YWwgY2FwYWNpdGllcyBhcyBTdHVkaWVzIDEtMi4gQXMgaW4gU3R1ZHkgMiwgcGFydGljaXBhbnRzIHJlc3BvbmRlZCBvbiBhIDMtcG9pbnQgc2NhbGUgKCJubywiIGNvZGVkIGFzIDA7ICJraW5kYSwiIGNvZGVkIGFzIDAuNSwgInllcywiIGNvZGVkIGFzIDEpLiBUaGlzIHN0dWR5IGVtcGxveWVkIHRoZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCB3aXRoIHBhcnRpY2lwYW50cyByYW5kb21seSBvciBwc2V1ZG8tcmFuZG9tbHkgYXNzaWduZWQgdG8gYXNzZXNzIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyA5IGNoYXJhY3RlcnM6IGFuIGVsZXBoYW50LCBhIGdvYXQsIGEgbW91c2UsIGEgYmlyZCwgYSBiZWV0bGUsIGEgdGVkZHkgYmVhciwgYSBkb2xsLCBhIHJvYm90LCBvciBhIGNvbXB1dGVyLiAoU2VlIENoYXB0ZXIgSUkgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKIyMgUmVzdWx0cwoKIyMjIEFkdWx0cwoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kM19hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kM19hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM19hZCkKZDNfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkM19hZCwgc2NhbGVzX2VmYV93ZG1fZDNfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QzX2FkLCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kM19hZCIpCnNhdmVSRFMoZDNfYWRfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QzX2FkX3Njb3JlZF9hZCIpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gdGhlICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMTAuCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpwbG90c19kM19hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkM19hZF9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWdfZDNfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QzX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCgpmaWdfZDNfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDNfYWRfcGxvdHMsIGZpZ19kM19hZF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2QzX2FkX3RpdGxlLCBmaWdfZDNfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kM19hZF9wbG90c19sZWdfdGl0bGUKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC42LCByb3cgQS4KCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpGaXJzdCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIEhFQVJUIChGaWd1cmUgNC42LCBwYW5lbCBBMSkuIEVjaG9pbmcgdGhlIHZpc3VhbGl6YXRpb25zIG9mIGFkdWx0cycgcmVzcG9uc2VzIGluIFN0dWRpZXMgMSBhbmQgMiwgdHdvIHN0cmlraW5nIGZlYXR1cmVzIG9mIHRoaXMgdmlzdWFsaXphdGlvbiBhcmUgdGhhdCAoMSkgdGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIHZpcnR1YWxseSBubyBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSksIGFuZCBjZXJ0YWlubHkgbm8gZGF0YXBvaW50cyBpbiB0aGUgdXBwZXIgbGVmdCBxdWFkcmFudC4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIG1hbnkgcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24sIGJ1dCB2aXJ0dWFsbHkgbm8gcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIEJPRFkuIAoKVmlzdWFsIGluc3BlY3Rpb24gb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciBmdXJ0aGVyIHJldmVhbHMgYSBzdWl0ZSBvZiBjaGFyYWN0ZXJz4oCUbmFtZWx5LCBpbmFuaW1hdGUgb2JqZWN0c+KAlHRoYXQsIGluIHRoZSBhZ2dyZWdhdGUsIHJlY2VpdmVkIHZlcnkgbG93IF9CT0RZXyBzY29yZXMgYW5kIHZlcnkgbG93IF9IRUFSVF8gc2NvcmVzLiBUaGlzIHN1aXRlIG9mIGNoYXJhY3RlcnMgYXBwZWFycyB0byBiZSBkaXN0aW5jdCBmcm9tIHRoZSBvdGhlciBjaGFyYWN0ZXJz4oCUYWxsIGFuaW1hdGUgYmVpbmdz4oCUYWxsIG9mIHdoaWNoLCBpbiB0aGUgYWdncmVnYXRlLCByZWNlaXZlZCByZWxhdGl2ZWx5IGhpZ2ggX0JPRFlfIHNjb3JlcywgYnV0IHZhcmllZCBpbiB0aGVpciBtZWFuIF9IRUFSVF8gc2NvcmVzLiBFY2hvaW5nIFN0dWR5IDFkLCB0aGlzIHJhaXNlcyB0aGUgaW50cmlndWluZyBwb3NzaWJpbGl0eSB0aGF0IGFkdWx0cycgYXR0cmlidXRpb25zIG9mIEJPRFkgYW5kIEhFQVJUIG1heSBoYXZlIGJlZW4gZ292ZXJuZWQgYnkgc29tZSBzb3J0IG9mICJ0aHJlc2hvbGQiIG1vZGVsLCBpbiB3aGljaCBhdHRyaWJ1dGlvbnMgb2YgYW55IHN1YnN0YW50aWFsIGFtb3VudCBvZiBIRUFSVCBkZXBlbmQgb24gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaGF2aW5nIGEgY2VydGFpbiBkZWdyZWUgb2YgQk9EWS4gKFRoaXMgd2lsbCBub3QgYmUgZXhwbG9yZWQgZnVydGhlciBpbiB0aGUgY3VycmVudCBkaXNzZXJ0YXRpb24uKQoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjYsIHBhbmVsIEEyKS4gQXMgaW4gdmlzdWFsaXphdGlvbnMgb2YgYWR1bHRzJyByZXNwb25zZXMgaW4gU3R1ZGllcyAxIGFuZCAyLCB0d28gbm90YWJsZSBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIGZld2VyIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGFib3ZlIGl0LCBhbmQgbm8gZGF0YXBvaW50cyBpbiB0aGUgbG93ZXIgcmlnaHQgcXVhZHJhbnQuIEVjaG9pbmcgU3R1ZHkgMWQsIGhvd2V2ZXIsIHdoaWxlIHBhcnRpY2lwYW50cyB3aG8gYXNzZXNzZWQgY2VydGFpbiB0YXJnZXQgY2hhcmFjdGVycyAobmFtZWx5LCB0aGUgdHdvIHRlY2hub2xvZ2llczogYSByb2JvdCBhbmQgYSBjb21wdXRlcikgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIHJvdWdobHkgYXMgc3Ryb25nbHksIGFuZCBvZnRlbiBtb3JlIHN0cm9uZ2x5LCB0aGFuIHRoZXkgZW5kb3JzZWQgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9CT0RZXyBzY2FsZSwgcGFydGljaXBhbnRzIHdobyBhc3Nlc3NlZCBvdGhlciB0YXJnZXQgY2hhcmFjdGVycywgaWYgYW55dGhpbmcsIGFwcGVhciB0byBoYXZlIHNob3duIHRoZSByZXZlcnNlIHBhdHRlcm4sIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgc2xpZ2h0bHkgbGVzcyBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcy4gSW4gb3RoZXIgd29yZHMsIGluIHRoaXMgImRpdmVyc2UgY2hhcmFjdGVycyIgYXBwcm9hY2ggc2hhcmVkIGJ5IFN0dWRpZXMgMWQgYW5kIHRoZSBjdXJyZW50IHN0dWR5LCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgbGVzcyBjb25zaXN0ZW5jeSBpbiB0aGUgImFzeW1tZXRyeSIgYmV0d2VlbiBCT0RZIGFuZCBNSU5EIGluIHRoYW4gdGhlcmUgd2FzIHVzaW5nIHRoZSAiZWRnZSBjYXNlcyIgYXBwcm9hY2ggb2YgU3R1ZGllcyAxYS0xYyBhbmQgU3R1ZHkgMi4KCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpGaW5hbGx5IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gSEVBUlQgYW5kIE1JTkQgKEZpZ3VyZSA0LjYsIHBhbmVsIEEzKS4gQXMgaW4gU3R1ZHkgMSwgdGhlIG1vc3Qgc3RyaWtpbmcgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlczsgYW5kICgyKSB0aGVyZSBhcmUgdmlydHVhbGx5IG5vIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSwgYW5kIGNlcnRhaW5seSBubyBkYXRhcG9pbnRzIGluIHRoZSBsb3dlciByaWdodCBxdWFkcmFudC4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIG1hbnkgcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24sIGJ1dCB2aXJ0dWFsbHkgbm8gcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIE1JTkQuCgpWaXN1YWwgaW5zcGVjdGlvbiBvZiBtZWFuIHNjb3JlcyBieSB0YXJnZXQgY2hhcmFjdGVyIGZ1cnRoZXIgcmV2ZWFscyB0aGF0LCBpbiB0aGUgYWdncmVnYXRlLCBjaGFyYWN0ZXJzIHRoYXQgcmVjZWl2ZWQgbG93IF9NSU5EXyBzY29yZXMgKHRoZSB0d28gaW5lcnQgdG95czogYSB0ZWRkeSBiZWFyIGFuZCBhIGRvbGwpIGFsc28gcmVjZWl2ZWQgbG93IG1lYW4gX0hFQVJUXyBzY29yZXMsIHdoaWxlIGNoYXJhY3RlcnMgdGhhdCByZWNlaXZlZCByZWxhdGl2ZWx5IGhpZ2ggX01JTkRfIHNjb3JlcyAoZS5nLiwgdGhlIHJvYm90IGFuZCBhbGwgb2YgdGhlIGFuaW1hdGUgYmVpbmdzKSB2YXJpZWQgaW4gdGhlaXIgbWVhbiBfSEVBUlRfIHNjb3Jlcy4gQWdhaW4sIHRoaXMgZWNob2VzIHRoZSBpbnRyaWd1aW5nIHBvc3NpYmlsaXR5LCByYWlzZWQgYnkgU3R1ZHkgMWQsIHRoYXQgYXR0cmlidXRpb25zIG9mIEhFQVJUIGFuZCBNSU5EIG1heSBoYXZlIGJlZW4gZ292ZXJuZWQgYnkgc29tZSBzb3J0IG9mICJ0aHJlc2hvbGQiIG1vZGVsLCBpbiB3aGljaCBhdHRyaWJ1dGlvbnMgb2YgYW55IHN1YnN0YW50aWFsIGFtb3VudCBvZiBIRUFSVCBkZXBlbmQgb24gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaGF2aW5nIGEgY2VydGFpbiBkZWdyZWUgb2YgTUlORC4gKEFnYWluLCB0aGlzIHdpbGwgbm90IGJlIGV4cGxvcmVkIGZ1cnRoZXIgaW4gdGhlIGN1cnJlbnQgZGlzc2VydGF0aW9uLikKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKTXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGFkdWx0cycgZW5kb3JzZW1lbnRzIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDMgYXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBmb3IgYWR1bHRzIGluIFN0dWRpZXMgMSBhbmQgMiAocGFydGljdWxhcmx5IFN0dWR5IDFkLCB3aGljaCBhbHNvIGVtcGxveWVkIHRoZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiBhcHByb2FjaCB0YWtlbiBoZXJlKTogKDEpIEFsbCBvZiB0aGVzZSBpbnRlci11bml0IHJlbGF0aW9uc2hpcHMgd2VyZSBwb3NpdGl2ZSwgc3VjaCB0aGF0IHRoZSBtb3JlIHN0cm9uZ2x5IGEgcGFydGljaXBhbnQgZW5kb3JzZWQgb25lIGNvbmNlcHR1YWwgdW5pdCwgdGhlIG1vcmUgc3Ryb25nbHkgdGhleSB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgb3RoZXJzOyBhbmQgKDIpIFRoZXJlIHdlcmUgcm9idXN0IGFzeW1tZXRyaWVzIGluIHRoZXNlIHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMsIHN1Y2ggdGhhdCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgZWl0aGVyIEJPRFkgb3IgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIEFzIGluIFN0dWR5IDFkLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSB2cy4gTUlORCBhcHBlYXJzIHRvIGJlIG1vcmUgdmFyaWFibGUgYWNyb3NzIHBhcnRpY2lwYW50cyBhbmQgYWNyb3NzIHRhcmdldCBjaGFyYWN0ZXJzIHRoYW4gdGhlIGdlbmVyYWxseSBhc3ltbWV0cmljYWwgcmVsYXRpb25zaGlwICh3aXRoIHBhcnRpY2lwYW50cyB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIE1JTkQgdGhhbiBCT0RZKSB0aGF0IGVtZXJnZWQgaW4gc3R1ZGllcyB0aGF0IHVzZWQgdGhlICJlZGdlIGNhc2UiIGFwcHJvYWNoIChTdHVkaWVzIDFhLTFjIGFuZCBTdHVkeSAyKS4KCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIHRoZSBhc3ltbWV0cmllcyByZXZlYWxlZCBieSB0aGUgdmlzdWFsaXphdGlvbnMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uIEZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgY29uZHVjdCBhIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgbmluZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gU2VlIEZpZ3VyZSA0LjcsIHBhbmVsIEEsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkM19hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkM19hZF9zY29yZWRfYWQpCmNvbnRyYXN0cyhkM19hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZHYwOQoKc2F2ZVJEUyhkM19hZF9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QzX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kM19hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDNfYWRfc2NvcmVkX2FkX2RpZmYsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQojIHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kM19hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQWR1bHRzIiwKICBjaGFyX2xhYmVsID0gYygiRWxlcGhhbnQgdnMuIEdNIiwgIkdvYXQgdnMuIEdNIiwgIk1vdXNlIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkJpcmQgdnMuIEdNIiwgIkJlZXRsZSB2cy4gR00iLCAiVGVkZHkgYmVhciB2cy4gR00iLAogICAgICAgICAgICAgICAgICJEb2xsIHZzLiBHTSIsICJSb2JvdCB2cy4gR00iKSkKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDNfYWRfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgaW4gU3R1ZGllcyAxIGFuZCAyLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX0JPRFlfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNikuIFRoaXMgYXN5bW1ldHJ5IHdhcyBkcml2ZW4gYnkgcmVzcG9uc2VzIHRvIHRoZSBhbmltYXRlIGJlaW5ncyAoYW5kIHdhcyBzdWJzdGFudGlhbGx5IG1vcmUgcHJvbm91bmNlZCBmb3IgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBIRUFSVCIsIHBvc19uZWcgPSAicG9zIilgKTsgYW1vbmcgaW5hbmltYXRlIGJlaW5ncywgZGlmZmVyZW5jZSBzY29yZXMgaG92ZXJlZCBhcm91bmQgemVybyAoYW5kIHdlcmUgc3Vic3RhbnRpYWxseSBsZXNzIHByb25vdW5jZWQgZm9yIGByIG5vbnplcm9fZnVuKHJlZ3RhYiA9IHJlZ3RhYl9kM19hZF9zY29yZWRfYWRfZGlmZiwgd2hpY2hfcGFpciA9ICJCT0RZIC0gSEVBUlQiLCBwb3NfbmVnID0gIm5lZyIpYDsgc2VlIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42LgoKIyMjIyMgQk9EWSB2cy4gTUlORAoKQXMgaW4gU3R1ZGllcyAxIGFuZCAyLCBvbiB0aGUgd2hvbGUsIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gSG93ZXZlciwgdGhpcyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBieSByZXNwb25zZXMgdG8gdGhlIHR3byB0ZWNobm9sb2dpZXMgKHBhcnRpY3VsYXJseSB0aGUgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBNSU5EIiwgcG9zX25lZyA9ICJuZWciKWApLiBJdCB3YXMgbXVjaCBsZXNzIHByb25vdW5jZWTigJRhbmQgaW4gc29tZSBjYXNlcyByYW4gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbuKAlGZvciBvdGhlciBjaGFyYWN0ZXJzIChwYXJ0aWN1bGFybHkgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBNSU5EIiwgcG9zX25lZyA9ICJwb3MiKWApOyBzZWUgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNi4gCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQXMgaW4gU3R1ZGllcyAxIGFuZCAyLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNikuIEFnYWluLCB0aGlzIGFzeW1tZXRyeSB3YXMgbW9yZSBwcm9ub3VuY2VkIGZvciBzb21lIGNoYXJhY3RlcnMgKGByIG5vbnplcm9fZnVuKHJlZ3RhYiA9IHJlZ3RhYl9kM19hZF9zY29yZWRfYWRfZGlmZiwgd2hpY2hfcGFpciA9ICJIRUFSVCAtIE1JTkQiLCBwb3NfbmVnID0gIm5lZyIpYCksIGFuZCBsZXNzIHByb25vdW5jZWQgZm9yIG90aGVycyAobmFtZWx5LCB0aGUgdHdvIGluZXJ0IHRveXM6IGByIG5vbnplcm9fZnVuKHJlZ3RhYiA9IHJlZ3RhYl9kM19hZF9zY29yZWRfYWRfZGlmZiwgd2hpY2hfcGFpciA9ICJIRUFSVCAtIE1JTkQiLCBwb3NfbmVnID0gInBvcyIpYDsgc2VlIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClRoZXNlIGZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDMgY29uZmlybSBteSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgb2YgYXN5bW1ldHJpZXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBlY2hvaW5nIHRoZSBhbmFseXNlcyBvZiBhZHVsdHMgaW4gU3R1ZGllcyAxIGFuZCAyOiBBY3Jvc3MgYWxsIG9mIHRoZXNlIHN0dWRpZXMsIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBib3RoIEJPRFkgYW5kIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULCB3aGlsZSB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gTUlORCBhbmQgQk9EWSB3YXMgY29udGluZ2VudCBvbiB0aGUgdHlwZSBvZiB0YXJnZXQgY2hhcmFjdGVyIHVuZGVyIGNvbnNpZGVyYXRpb24uCgojIyMgQ2hpbGRyZW4gKDctOXkpCgpYWCBfX0lOU0VSVCBTRUNUSU9OIElOVFJPRFVDVElPTi9UUkFOU0lUSU9OX18KCmBgYHtyfQojIGp1c3QgZm9yIHRhYmxlCnNjYWxlc19lZmFfd2RtX2QzXzc5IDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QzXzc5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzXzc5KQpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QzXzc5LCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kM183OSIpCmBgYAoKYGBge3J9CmQzXzc5X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDNfNzksIHNjYWxlc19lZmFfd2RtX2QzX2FkKQpzYXZlUkRTKGQzXzc5X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kM183OV9zY29yZWRfYWQiKQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2QzXzc5X3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQzXzc5X3Njb3JlZF9hZCwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM183OV9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDNfNzlfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNzlfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNzlfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWdfZDNfNzlfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDNfNzlfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKCmZpZ19kM183OV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kM183OV9wbG90cywgZmlnX2QzXzc5X2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kM183OV90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDM6IENoaWxkcmVuLCA3LTl5ICh1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzXzc5X3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2QzXzc5X3RpdGxlLCBmaWdfZDNfNzlfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kM183OV9wbG90c19sZWdfdGl0bGUKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC42LCByb3cgQi4KCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpGaXJzdCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIEhFQVJUIChGaWd1cmUgNC42LCBwYW5lbCBCMSkuIEFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChwYW5lbCBBMSksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdOKAlGJ1dCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiAobGlrZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBhZHVsdHMpLCBxdWl0ZSBhIGZldyBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBCT0RZLiBGdXJ0aGVybW9yZSwgYSB2aXN1YWwgaW5zcGVjdGlvbiBvZiB0aGlzIHBsb3Qgc3VnZ2VzdHMgdGhhdCB0aGUgYXN5bW1ldHJ5IG1heSBoYXZlIGV2ZW4gZ29uZSBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zIGZvciBhIHRhcmdldCBjaGFyYWN0ZXIgb2YgcGFydGljdWxhciBpbnRlcmVzdOKAlHRoZSByb2JvdOKAlHdpdGggY2hpbGRyZW4gdGVuZGluZyB0byBhdHRyaWJ1dGUgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhpcyB1bnVzdWFsIHNvY2lhbCBwYXJ0bmVyLgoKRWNob2luZyB0aGUgdmlzdWFsaXphdGlvbnMgb2YgYWR1bHRzJyByZXNwb25zZXMsIHRoZXJlIGRvIGFwcGVhciB0byBiZSB0d28gc3VpdGVzIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyB2aXN1YWxpemF0aW9uOiBpbmFuaW1hdGUgb2JqZWN0cyAoY2hhcmFjdGVyaXplZCBieSBnZW5lcmFsbHkgbG93IF9CT0RZXyBzY29yZXMpIGFuZCBhbmltYXRlIGJlaW5ncyAoY2hhcmFjdGVyaXplZCBieSBnZW5lcmFsbHkgaGlnaCBfQk9EWV8gc2NvcmVzKS4gSG93ZXZlciwgd2hpbGUgYW1vbmcgYWR1bHRzIG9ubHkgYW5pbWF0ZSBiZWluZ3MgdmFyaWVkIGluIHRoZWlyIG1lYW4gX0hFQVJUXyBzY29yZXMsIGFtb25nIGNoaWxkcmVuIHRoZXJlIGFwcGVhcnMgdG8gYmUgc3Vic3RhbnRpYWwgdmFyaWFiaWxpdHkgaW4gX0hFQVJUXyBzY29yZXMgaW4gYm90aCBvZiB0aGVzZSBncm91cHMgb2YgY2hhcmFjdGVycy4gSW4gb3RoZXIgd29yZHMsIHRoaXMgdmlzdWFsaXphdGlvbiBkb2VzIG5vdCBwcm92aWRlIGV2aWRlbmNlIG9mIHRoZSBraW5kIG9mICJ0aHJlc2hvbGQiIG1vZGVsIGRpc2N1c3NlZCBmb3IgYWR1bHRzLgoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjYsIHBhbmVsIEIyKS4gQW1vbmcgYWR1bHRzLCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdhcyBjbGVhcmx5IHBvc2l0aXZlLCBhbmQgdGhlcmUgd2VyZSBub3RhYmx5IGZld2VyIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGFib3ZlIGl04oCUYnV0IG5laXRoZXIgb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIGlzIHBhcnRpY3VsYXJseSBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiBpbiB0aGlzIHNhbXBsZS4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIHNvbWUgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiAocGFydGljdWxhcmx5IGlmIHRoZXkgd2VyZSBldmFsdWF0aW5nIG9uZSBvZiB0aGUgdHdvIHRlY2hub2xvZ2llcyksIG90aGVycyBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBCT0RZIChwYXJ0aWN1bGFybHkgaWYgdGhleSB3ZXJlIGV2YWx1YXRpbmcgb25lIG9mIGFuaW1hdGUgYmVpbmdzKS4gVGhpcyBlY2hvZXMgdGhlIGRpZmZlcmVuY2VzIGFjcm9zcyBjaGFyYWN0ZXJzIGluIHRoZSBzdHJlbmd0aCBhbmQgZGlyZWN0aW9uIG9mIGFzeW1tZXRyaWVzIGJldHdlZW4gX0JPRFlfIGFuZCBfTUlORF8gb2JzZXJ2ZWQgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHk7IGluZGVlZCwgc3VjaCBiZXR3ZWVuLWNoYXJhY3RlciBkaWZmZXJlbmNlcyBhcHBlYXIgdG8gYmUgZXZlbiBtb3JlIHByb25vdW5jZWQgYW1vbmcgY2hpbGRyZW4uCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5EIChGaWd1cmUgNC42LCBwYW5lbCBCMykuIEFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChwYW5lbCBBMyksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdOKAlGJ1dCBhZ2FpbiBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiAobGlrZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBhZHVsdHMpLCBxdWl0ZSBhIGZldyBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELiAKVmlzdWFsIGluc3BlY3Rpb24gb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciByZXZlYWxzIG5vIGV2aWRlbmNlIG9mIHRoZSBraW5kIG9mICJ0aHJlc2hvbGQiIG1vZGVsIGRpc2N1c3NlZCBmb3IgYWR1bHRzLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpBcyBpbiB0aGUgY29tcGFyaXNvbiBvZiBhZHVsdHMgYW5kIGNoaWxkcmVuIGluIFN0dWR5IDIsIG15IGluZm9ybWFsIG9ic2VydmF0aW9ucyBvZiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBvbGRlciBjaGlsZHJlbidzIGVuZG9yc2VtZW50cyBvZiB0aGUgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAzIGFyZSBicm9hZGx5IHNpbWlsYXIgdG8gdGhvc2Ugb2YgYWR1bHRzIGluIHRoaXMgc3R1ZHksIGJ1dCBkcmFtYXRpY2FsbHkgYXR0ZW51YXRlZDogKDEpIFRoZXNlIGludGVyLXVuaXQgcmVsYXRpb25zaGlwcyB3ZXJlIHdoYXQgcG9zaXRpdmUsIGJ1dCBvbmx5IHNvbWV3aGF0OyBhbmQgKDIpIFRoZXJlIHdhcyBzb21lIGV2aWRlbmNlIG9mIGFzeW1tZXRyaWVzIGluIHRoZXNlIHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMsIGJ1dCB0aGVzZSBhc3ltbWV0cmllcyB3ZXJlIGdlbmVyYWxseSB3ZWFrZXIgYW5kIGFwcGVhcmVkIHRvIGJlIGhpZ2hseSBkZXBlbmRlbnQgb24gd2hpY2ggdGFyZ2V0IGNoYXJhY3RlciBwYXJ0aWNpcGFudHMgYXNzZXNzZWQgKHBhcnRpY3VsYXJseSBmb3IgdGhlIEJPRFkgdnMuIEhFQVJUIGFuZCBCT0RZIHZzLiBNSU5EIGNvbXBhcmlzb25zKS4KCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIHRoZSBhc3ltbWV0cmllcyByZXZlYWxlZCBieSB0aGUgdmlzdWFsaXphdGlvbnMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uIEZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgY29uZHVjdCBhIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgbmluZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gU2VlIEZpZ3VyZSA0LjcsIHBhbmVsIEIsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkM183OV9zY29yZWRfYWQpCmNvbnRyYXN0cyhkM183OV9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZHYwOQoKc2F2ZVJEUyhkM183OV9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QzXzc5X3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsCiAgY2hhcl9sYWJlbCA9IGMoIkVsZXBoYW50IHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsICJNb3VzZSB2cy4gR00iLAogICAgICAgICAgICAgICAgICJCaXJkIHZzLiBHTSIsICJCZWV0bGUgdnMuIEdNIiwgIlRlZGR5IGJlYXIgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiRG9sbCB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kM183OV9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzXzc5X3Njb3JlZF9hZF9kaWZmCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGFtb25nIGFkdWx0cywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjYpLiBMaWtlIGFkdWx0cywgb2xkZXIgY2hpbGRyZW4ncyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBieSByZXNwb25zZXMgdG8gdGhlIGFuaW1hdGUgYmVpbmdzIChhbmQgd2FzIHN1YnN0YW50aWFsbHkgbW9yZSBwcm9ub3VuY2VkIGZvciBgciBub256ZXJvX2Z1bihyZWd0YWIgPSByZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIEhFQVJUIiwgcG9zX25lZyA9ICJwb3MiKWApOyBhbW9uZyBpbmFuaW1hdGUgYmVpbmdzLCBkaWZmZXJlbmNlIHNjb3JlcyBob3ZlcmVkIGFyb3VuZCAob3IgYmVsb3cpIHplcm8gKGFuZCB3ZXJlIHN1YnN0YW50aWFsbHkgbGVzcyBwcm9ub3VuY2VkIGZvciBgciBub256ZXJvX2Z1bihyZWd0YWIgPSByZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIEhFQVJUIiwgcG9zX25lZyA9ICJuZWciKWA7IHNlZSB0aGUgdmFyaW91cyBjb21wYXJpc29ucyBvZiB0YXJnZXQgY2hhcmFjdGVycyB0byB0aGUgZ3JhbmQgbWVhbiBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNi4KCiMjIyMjIEJPRFkgdnMuIE1JTkQKCmRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgbm90IHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IGZyb20gemVybywgaW4gY29udHJhc3QgdG8gYW5hbHlzZXMgb2YgYWR1bHRzIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gVGhpcyBhcHBlYXJzIHRvIGJlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBhc3ltbWV0cnkgd2VudCBpbiBkaWZmZXJlbnQgZGlyZWN0aW9ucyBmb3IgZGlmZmVyZW50IGNoYXJhY3RlcnM6IE9sZGVyIGNoaWxkcmVuIHRlbmRlZCB0byBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEJPRFkgdCB0aGUgdHdvIHRlY2hub2xvZ2llcyAocm9ib3QsIGNvbXB1dGVyKSwgYnV0IHRlbmRlZCB0byBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIE1JTkQgdG8gdGhlIGFuaW1hdGUgYmVpbmdzIChwYXJ0aWN1bGFybHkgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzXzc5X3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBNSU5EIiwgcG9zX25lZyA9ICJwb3MiKWApOyBzZWUgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNi4gCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQXMgYW1vbmcgYWR1bHRzLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIGNoaWxkcmVuIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gVGhpcyBhc3ltbWV0cnkgYXBwZWFyZWQgdG8gaG9sZCB0cnVlIGFjcm9zcyB0aGUgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gdGhpcyBzdHVkeSwgIGFuZCBsZXNzIHByb25vdW5jZWQgZm9yIG90aGVyczsgc2VlIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42LiAKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhbW9uZyBvbGRlciBjaGlsZHJlbiAoNy05eSkgaW4gU3R1ZHkgMyBjb25maXJtIG15IGluZm9ybWFsIG9ic2VydmF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbjogT2xkZXIgY2hpbGRyZW4gdGVuZGVkIHRvIGVuZG9yc2UgYm90aCBCT0RZIGFuZCBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVCwgd2hpbGUgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIE1JTkQgYW5kIEJPRFkgd2FzIGhpZ2hseSBjb250aW5nZW50IG9uIHRoZSB0eXBlIG9mIHRhcmdldCBjaGFyYWN0ZXIgdW5kZXIgY29uc2lkZXJhdGlvbi4KCiMjIyBDaGlsZHJlbiAoNC02eSkKClhYIF9fSU5TRVJUIFNFQ1RJT04gSU5UUk9EVUNUSU9OL1RSQU5TSVRJT05fXwoKYGBge3J9CmQzXzQ2X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDNfNDYsIHNjYWxlc19lZmFfd2RtX2QzX2FkKQpzYXZlUkRTKGQzXzQ2X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kM180Nl9zY29yZWRfYWQiKQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2QzXzQ2X3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQzXzQ2X3Njb3JlZF9hZCwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM180Nl9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDNfNDZfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNDZfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNDZfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQzEiLCAiQzIiLCAiQzMiKSwgbmNvbCA9IDMpCgpmaWdfZDNfNDZfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDNfNDZfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKCmZpZ19kM180Nl9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kM180Nl9wbG90cywgZmlnX2QzXzQ2X2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kM180Nl90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDM6IENoaWxkcmVuLCA0LTZ5ICh1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzXzQ2X3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2QzXzQ2X3RpdGxlLCBmaWdfZDNfNDZfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kM180Nl9wbG90c19sZWdfdGl0bGUKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC42LCByb3cgQy4KCkluIGNvbnRyYXN0IHRvIHRoZSB2aXN1YWxpemF0aW9ucyBvZiB0aGVzZSByZWxhdGlvbnNoaXBzIGFtb25nIGFkdWx0cyBhbmQgb2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSwgYW1vbmcgeW91bmdlciBjaGlsZHJlbiB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIEJPRFksIEhFQVJULCBhbmQgTUlORCAoYXMgaW5kZXhlZCBieSBhZHVsdHMnIHNjYWxlcykgYWxsIGxvb2tlZCByYXRoZXIgc2ltaWxhci4gSW4gcGFydGljdWxhciwgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLCB0aGVyZSBhcHBlYXJlZCB0byBiZSBhIHNvbWV3aGF0IHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgdHdvIHNjYWxlczsgdGhpcyBhbGlnbnMgd2l0aCBteSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgb2YgYWR1bHRzIGFuZCBvbGRlciBjaGlsZHJlbi4gSW4gZWFjaCBjYXNlIChwYXJ0aWN1bGFybHkgaW4gdGhlIEJPRFkgdnMuIEhFQVJUIGFuZCBCT0RZIHZzLiBNSU5EIGNvbXBhcmlzb25zKSwgdHdvIHN1aXRlcyBvZiBjaGFyYWN0ZXJzIGVtZXJnZWQ6IEEgZ3JvdXAgb2YgaW5hbmltYXRlIG9iamVjdHMgKHdoaWNoLCBpbiB0aGUgYWdncmVnYXRlLCByZWNlaXZlZCBtb2RlcmF0ZWx5IGxvdyBzY29yZXMgb24gYWxsIHNjYWxlcyksIGFuZCBhIGdyb3VwIG9mIGFuaW1hdGUgYmVpbmdzICh3aGljaCwgaW4gdGhlIGFnZ3JlZ2F0ZSwgcmVjZWl2ZWQgbW9kZXJhdGVseSBoaWdoIHNjb3JlcyBvbiBhbGwgc2NhbGVzKS4KCkFuIGluZm9ybWFsIGluc3BlY3Rpb24gb2YgdGhlc2UgdmlzdWFsaXphdGlvbnMgc3VnZ2VzdHMgb25seSBtb2RlcmF0ZSBhc3ltbWV0cmllcyBpbiB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORCBjYXBhY2l0aWVzLiBJbiB0aGUgY2FzZSBvZiBCT0RZIHZzLiBIRUFSVCwgeW91bmdlciBjaGlsZHJlbiB0ZW5kZWQgdG8gYXR0cmlidXRlIG1vcmUgQk9EWSB0aGFuIEhFQVJUIChwYW5lbCBDMSksIGJ1dCB0aGlzIHRlbmRlbmN5IHdhcyBxdWl0ZSB3ZWFrLiBJbiB0aGUgY2FzZSBvZiBCT0RZIHZzLiBNSU5EIChwYW5lbCBDMiksIHlvdW5nZXIgY2hpbGRyZW4ncyB0ZW5kZWQgKGFnYWluLCB3ZWFrbHkpIHRvIGF0dHJpYnV0ZSBtb3JlIEJPRFkgdGhhbiBNSU5E4oCUdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBvZiBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLiBJbiB0aGUgY2FzZSBvZiBIRUFSVCB2cy4gTUlORCwgdGhpcyB2aXN1YWxpemF0aW9uIChwYW5lbCBDMykgc3VnZ2VzdHMgbm8gc3lzdGVtYXRpYyBhc3ltbWV0cnkgaW4geW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucy4KCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIHRoZSBhc3ltbWV0cmllcyAob3IgbGFjayB0aGVyZW9mKSByZXZlYWxlZCBieSB0aGUgdmlzdWFsaXphdGlvbnMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uIEZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgY29uZHVjdCBhIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgbmluZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gU2VlIEZpZ3VyZSA0LjcsIHBhbmVsIEMsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkM180Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkM180Nl9zY29yZWRfYWQpCmNvbnRyYXN0cyhkM180Nl9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZHYwOQoKc2F2ZVJEUyhkM180Nl9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QzXzQ2X3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kM180Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDNfNDZfc2NvcmVkX2FkX2RpZmYsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQojIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM180Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kM180Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQ2hpbGRyZW4sIDQtNnkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsCiAgY2hhcl9sYWJlbCA9IGMoIkVsZXBoYW50IHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsICJNb3VzZSB2cy4gR00iLAogICAgICAgICAgICAgICAgICJCaXJkIHZzLiBHTSIsICJCZWV0bGUgdnMuIEdNIiwgIlRlZGR5IGJlYXIgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiRG9sbCB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kM180Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzXzQ2X3Njb3JlZF9hZF9kaWZmCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGFtb25nIGFkdWx0cyBhbmQgb2xkZXIgY2hpbGRyZW4sIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gQXMgd2l0aCBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLCB0aGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gYnkgcmVzcG9uc2VzIHRvIHRoZSBhbmltYXRlIGJlaW5ncywgd2hpbGUgZGlmZmVyZW5jZSBzY29yZXMgZm9yIGluYW5pbWF0ZSBiZWluZ3MgaG92ZXJlZCBhcm91bmQgKG9yIGJlbG93KSB6ZXJvOyBzZWUgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjYuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJv4oCUYnV0IGluIGNvbnRyYXN0cyB0byBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIHRoaXMgYXN5bW1ldHJ5IHJhbiBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGluZyBtb3JlIF9CT0RZXyB0aGFuIF9NSU5EXyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNikuIFRoaXMgYXN5bW1ldHJ5IGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGRyaXZlbiBieSByZXNwb25zZXMgdG8gYW5pbWF0ZSBiZWluZ3MgKGFuZCB3YXMgcGFydGljdWxhcmx5IHByb25vdW5jZWQgZm9yIHBhcnRpY3VsYXJseSBgciBub256ZXJvX2Z1bihyZWd0YWIgPSByZWd0YWJfZDNfNDZfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIE1JTkQiLCBwb3NfbmVnID0gInBvcyIpYCk7IHNlZSB0aGUgdmFyaW91cyBjb21wYXJpc29ucyBvZiB0YXJnZXQgY2hhcmFjdGVycyB0byB0aGUgZ3JhbmQgbWVhbiBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42LiAKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpJbiBjb250cmFzdCB0byBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLCBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyBkaWQgbm90IGRpZmZlciBzdWJzdGFudGlhbGx5IGZyb20gemVybywgYW5kIHZhcmllZCBvbmx5IHN1YnRseSBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnM7IHNlZSB0aGUgdmFyaW91cyBjb21wYXJpc29ucyBvZiB0YXJnZXQgY2hhcmFjdGVycyB0byB0aGUgZ3JhbmQgbWVhbiBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNi4gCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClRoZXNlIGZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYW1vbmcgeW91bmdlciBjaGlsZHJlbiAoNC02eSkgaW4gU3R1ZHkgMyBjb25maXJtIG15IGluZm9ybWFsIG9ic2VydmF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gTGlrZSBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCB5b3VuZ2VyIGNoaWxkcmVuIHRlbmRlZCB0byBlbmRvcnNlIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULiBIb3dldmVyLCB5b3VuZ2VyIGNoaWxkcmVuIGRpdmVyZ2VkIGZyb20gdGhlaXIgb2xkZXIgY291bnRlcnBhcnRzIGJ5IHN5c3RlbWF0aWNhbGx5IGVuZG9yc2luZyBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBNSU5ELCBhbmQgYnkgZmFpbGluZyB0byBzaG93IGFueSBzeXN0ZW1hdGljIGFzeW1tZXRyeSBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5ELgoKIyMjIERldmVsb3BtZW50YWwgY29tcGFyaXNvbgoKSW4gdGhlIHByZXZpb3VzIHNlY3Rpb25zLCBJIGFuYWx5emVkIGFkdWx0cycsIG9sZGVyIGNoaWxkcmVuJ3MsIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIHNlcGFyYXRlbHkuIEhlcmUgSSBjb25kdWN0IGEgZm9ybWFsIGNvbXBhcmlzb24gb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIGFtb25nIHRoZXNlIHRocmVlIGFnZSBncm91cHMsIHRvIGFzc2VzcyB0aGUgc2l6ZSBhbmQgcm9idXN0bmVzcyBvZiB0aGVzZSBvc3RlbnNpdmUgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcy4KCmBgYHtyfQpkM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYgPC0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiAgZnVsbF9qb2luKGQzXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBmdWxsX2pvaW4oZDNfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwKSkKY29udHJhc3RzKGQzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZHYwOQpjb250cmFzdHMoZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmJGFnZV9ncm91cCkgPC0gY29udHJhc3RzX2R1bTNfYWdlZ3AKYGBgCgpgYGB7cn0KIyByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCwKIyAgIGRhdGEgPSBkM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24iLAogIGNoYXJfbGFiZWwgPSBjKCJFbGVwaGFudCB2cy4gR00iLCAiR29hdCB2cy4gR00iLCAiTW91c2UgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiQmlyZCB2cy4gR00iLCAiQmVldGxlIHZzLiBHTSIsICJUZWRkeSBiZWFyIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkRvbGwgdnMuIEdNIiwgIlJvYm90IHZzLiBHTSIpLCAKICBhZ2VncF9sYWJlbCA9IGMoIk9sZGVyIGNoaWxkcmVuIHZzLiBhZHVsdHMiLCAKICAgICAgICAgICAgICAgICAgIllvdW5nZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyIpKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIgfCBncmVwbCgiY2hpbGRyZW4iLCB0b2xvd2VyKHBhcmFtKSkpICU+JQogIGZpbHRlcighZ3JlcGwoIlxcKiIsIHBhcmFtKSkgJT4lICMgcmVtb3ZlIGludGVyYWNhdGlvbnMKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2dyaWQocGxvdF9kM19hZF9zY29yZWRfYWRfZGlmZiwgCiAgICAgICAgICBwbG90X2QzXzc5X3Njb3JlZF9hZF9kaWZmLCAKICAgICAgICAgIHBsb3RfZDNfNDZfc2NvcmVkX2FkX2RpZmYsIAogICAgICAgICAgbmNvbCA9IDMpCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IGNsb3NlciB0byB6ZXJvIGFtb25nIGJvdGggb2xkZXIgYW5kIHlvdW5nZXIgY2hpbGRyZW4sIGFzIGNvbXBhcmVkIHRvIGFkdWx0cyAoc2VlIHRoZSAiT2xkZXIgdnMuIGFkdWx0cyIgYW5kICJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvd3MgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjcpLiBBIGhhbmRmdWwgb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgZGlmZmVyZWQgc3Vic3RhbnRpYWxseSBhY3Jvc3MgYWdlIGdyb3VwcyAoc2VlIHRoZSAiSW50ZXJhY3Rpb24iIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNyk7IHRoaXMgaXMgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhlIGN1cnJlbnQgY2hhcHRlci4gIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgbm90IGRpZmZlcmVudGlhYmxlIGZyb20gYWR1bHRzIGFtb25nIG9sZGVyIGNoaWxkcmVuIGluIHRoaXMgYW5hbHlzaXMsIGJ1dCByZXZlcnNlZCBpbiBzaWduIGFtb25nIHlvdW5nZXIgY2hpbGRyZW4gKHNlZSB0aGUgIk9sZGVyIHZzLiBhZHVsdHMiIGFuZCAiWW91bmdlciBjaGlsZHJlbiB2cy4gYWR1bHRzIiByb3dzIGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjcpLiBBZ2FpbiwgaGFuZGZ1bCBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBkaWZmZXJlZCBzdWJzdGFudGlhbGx5IGFjcm9zcyBhZ2UgZ3JvdXBzIChzZWUgdGhlICJJbnRlcmFjdGlvbiIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjcpOyB0aGlzIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoZSBjdXJyZW50IGNoYXB0ZXIuICAgIAoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IGNsb3NlciB0byB6ZXJvIGFtb25nIGJvdGggb2xkZXIgY2hpbGRyZW4gYW5kIHlvdW5nZXIgY2hpbGRyZW4sIGFzIGNvbXBhcmVkIHRvIGFkdWx0cyAoc2VlIHRoZSAiT2xkZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyIgYW5kICJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvd3MgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjcpLCBBZ2FpbiwgaGFuZGZ1bCBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBkaWZmZXJlZCBzdWJzdGFudGlhbGx5IGFjcm9zcyBhZ2UgZ3JvdXBzIChzZWUgdGhlICJJbnRlcmFjdGlvbiIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC43KTsgdGhpcyBpcyBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjaGFwdGVyLiAgCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClRoZXNlIGZvcm1hbCBjb21wYXJpc29ucyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuICg0LTZ5KSwgb2xkZXIgY2hpbGRyZW4gKDctOXkpLCBhbmQgYWR1bHRzIGluIFN0dWR5IDMgY29uZmlybSBteSBlYXJsaWVyIG9ic2VydmF0aW9ucyB0aGF0IGFzeW1tZXRyaWVzIHdlcmUgc3Vic3RhbnRpYWxseSBhdHRlbnVhdGVkIGFtb25nIGJvdGggb2xkZXIgYW5kIGVzcGVjaWFsbHkgeW91bmdlciBjaGlsZHJlbiwgcmVsYXRpdmUgdG8gdGhlIGJhc2VsaW5lIHNldCBieSBhZHVsdHMuIFRoZSBvbmx5IGV4Y2VwdGlvbnMgdG8gdGhpcyBydWxlIHdlcmUgKDEpIFRoZSBCT0RZIHZzLiBNSU5EIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIG9sZGVyIGNoaWxkcmVuIHdhcyBub3QgZGlmZmVyZW50aWFibGUgZnJvbSB0aG9zZSBvZiBhZHVsdHMgKGxpa2VseSBiZWNhdXNlIHRoaXMgd2FzIHRoZSB3ZWFrZXN0IG9mIHRoZSBhc3ltbWV0cmllcyBhbW9uZyBhZHVsdHMpOyBhbmQgKDIpIFRoZSBCT0RZIHZzLiBNSU5EIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIHlvdW5nZXIgY2hpbGRyZW4gcmFuIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gdG8gdGhvc2Ugb2YgYWR1bHRzIChhcyBkaXNjdXNzZWQgaW4gbXkgZWFybGllciBkZXNjcmlwdGlvbiBvZiB5b3VuZ2VyIGNoaWxkcmVuJ3MgcmVzcG9uc2VzKS4KCiMjIERpc2N1c3Npb24KClhYIF9fSU5TRVJUIFNUVURZIDMgRElTQ1VTU0lPTl9fCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MyA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDNfYWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzOiBBZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzOiBDaGlsZHJlbiwgNy05eSIpKSAlPiUKICBzZWxlY3QoLWMobG9hZGluZywgb3JkZXIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHNwcmVhZChzdHVkeSwgZmFjdG9yKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gYFN0dWR5IDM6IEFkdWx0c2ApICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kM19hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcl9hZCA9IG9yZGVyKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QzXzc5ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyXzc5ID0gb3JkZXIpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXJfYWQsIG9yZGVyXzc5KSAlPiUKICBzZWxlY3QoLXVyX2ZhY3RvcikgIyU+JQojIHNlbGVjdCgtc3RhcnRzX3dpdGgoIm9yZGVyIikpCmBgYAoKYGBge3J9CnBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZCA8LSByZWx2aXpfYWdlZ3BfZnVuKAogIGRfc2NvcmVkID0gZDNfYWRfc2NvcmVkX2FkICU+JSAKICAgIGZ1bGxfam9pbihkM183OV9zY29yZWRfYWQpICU+JSAKICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWQpLCAKICBhZ2VfZ3JvdXBzID0gYygiY2hpbGRyZW40NiIsICJjaGlsZHJlbjc5IiwgImFkdWx0cyIpLAogIGFnZV9ncm91cF9sYWJlbHMgPSBjKCJDaGlsZHJlbiwgKDQtNnkpIiwgIkNoaWxkcmVuICg3LTl5KSIsICJBZHVsdHMiKSwKICBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kM19zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkQxIiwgIkQyIiwgIkQzIiksIG5jb2wgPSAzKQoKZmlnX2QzX2FsbF9zY29yZWRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIG5hLnRyYW5zbGF0ZSA9IEYsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCgpmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKAogIGZpZ19kM19hbGxfc2NvcmVkX2FkX3Bsb3RzLCBmaWdfZDNfYWxsX3Njb3JlZF9hZF9sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kM19hbGxfc2NvcmVkX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiVHJhY2tpbmcgZGV2ZWxvcG1lbnQgYmV0d2VlbiA0LTl5IGFuZCBhZHVsdGhvb2QgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDNfYWxsX3Njb3JlZF9hZF90aXRsZSwgZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CmZpZ3VyZTQuNiA8LSBwbG90X2dyaWQoZmlnX2QzX2FkX3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QzXzc5X3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDNfNDZfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjZfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC42LCBzdHJfd3JhcCgiRmlndXJlIDQuNjogUmVsYXRpb25zaGlwcyBhbW9uZyBVUyBhZHVsdHMnLCBvbGRlciBjaGlsZHJlbidzLCBhbmQgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDMsIHNjb3JlZCB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHNlZSBUYWJsZSA0LjEwKS4gKEEpIEFkdWx0cy4gKEIpIE9sZGVyIGNoaWxkcmVuICg3LTl5IG9mIGFnZSkuIChDKSBZb3VuZ2VyIGNoaWxkcmVuICg0LTZ5IG9mIGFnZSkuIChEKSBBIHZpc3VhbGl6YXRpb24gb2YgZGV2ZWxvcG1lbnQgYmV0d2VlbiA0LTl5IGFuZCBhZHVsdGhvb2QsIHVzaW5nIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhbmQgYWdlIGdyb3VwLiBQbG90cyBhcmUgb3JnYW5pemVkIGJ5IHNhbXBsZSAocm93cykgYW5kIGJ5IHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoY29sdW1ucykuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbiBwYW5lbHMgQS1DLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiBQZWFyc29uIGNvcnJlbGF0aW9ucyBhcmUgcmVwb3J0ZWQgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS44fQpnZ2RyYXcoZmlndXJlNC42X2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC43X3Bsb3RzIDwtIHBsb3RfZ3JpZCgKICBwbG90X2QzX2FkX3Njb3JlZF9hZF9kaWZmICsKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMzogQWR1bHRzIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICBwbG90X2QzXzc5X3Njb3JlZF9hZF9kaWZmICsKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXkgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIHBsb3RfZDNfNDZfc2NvcmVkX2FkX2RpZmYgKyAKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMzogQ2hpbGRyZW4sIDQtNnkgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICBuY29sID0gMywgcmVsX3dpZHRocyA9IGMoMSwgMSwgMSksCiAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC43X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC43X3Bsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbGVnZW5kKHBsb3RfZDNfYWRfc2NvcmVkX2FkX2RpZmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMSkpCgpmaWd1cmU0LjdfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC43X3Bsb3RzX2xlZywgc3RyX3dyYXAoIkZpZ3VyZSA0Ljc6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAzLiB0aGlzIGluY2x1ZGVzIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAocGFuZWwgQikgYW5kIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAocGFuZWwgQzsgc2VlIFRhYmxlIDQuMTApLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE4MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC4zOH0KZ2dkcmF3KGZpZ3VyZTQuN19jYXApCmBgYAoKYGBge3J9CnJlZ3RhYl9zdHVkeTMgPC0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDNfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgQWR1bHRzYCwgYygiczJhX2IiLCAiczJhX3MuZS4iLCAiczJhXzk1JSBDSSIsICJzMmFfbnoiKSwgc2VwID0gIl8iKSAlPiUKICBzZXBhcmF0ZShgQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKWAsIGMoInMyYl9iIiwgInMyYl9zLmUuIiwgInMyYl85NSUgQ0kiLCAiczJiX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYENoaWxkcmVuLCA0LTZ5ICh1c2luZyBhZHVsdHMnIHNjYWxlcylgLCBjKCJzMmNfYiIsICJzMmNfcy5lLiIsICJzMmNfOTUlIENJIiwgInMyY19ueiIpLCBzZXAgPSAiXyIpCmBgYAoKYGBge3J9CnRhYmxlNC42IDwtIHJlZ3RhYl9zdHVkeTMgJT4lCiAgc2VsZWN0KC1wYWlyLCAtY29udGFpbnMoInMuZS4iKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigibnoiLCAiICIsIC4pKSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoInMyLl8iLCAiIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC42OiBSZWdyZXNzaW9uIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIFVTIGFkdWx0cywgb2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSwgYW5kIHlvdW5nZXIgY2hpbGRyZW4gKDQtNnkgb2YgYWdlKSBpbiBTdHVkeSAzLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gVGhlIGludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMSwgMTAsIDE5KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDkpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMTAsIDE4KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCAxOSwgMjcpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiQWR1bHRzIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjYKYGBgCgpgYGB7cn0KdGFibGU0LjcgPC0gcmVndGFiX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXBhaXIsIC1zdHVkeSwgLWNvbnRhaW5zKCJzLmUuIikpICU+JQogIG11dGF0ZShiID0gZm9ybWF0KHJvdW5kKGIsIDIpLCBuc21hbGwgPSAyKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtLAogICAgICAgICBgOTUlIENJYCA9IENJOTUpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJub256ZXJvIiwgIiAiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0Ljc6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZXMgaW4gZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBVUyBhZHVsdHMgYW5kIGJvdGggb2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSBhbmQgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpIGluIFN0dWR5IDMuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgZm91ciBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQgKGZvciBhZHVsdHMpLCB3aGljaCBJIHRyZWF0IGFzIGFuIGluZGV4IG9mIHRoZSBhc3ltbWV0cnkgaW4gYXR0cmlidXRpb25zIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBpbiBxdWVzdGlvbiBhbW9uZyBhZHVsdHM7ICgyKSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyAoYW1vbmcgYWR1bHRzKSwgcmVwb3J0ZWQgaGVyZSBhcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcm9ib3QgYW5kIHRoZSBncmFuZCBtZWFuIChHTSk7ICgzKSB0aGUgb3ZlcmFsbCBkaWZmZXJlbmNlIGJldHdlZW4gY2hpbGRyZW4gYW5kIGFkdWx0cyAoY29sbGFwc2luZyBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMpOyBhbmQgKDQpIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMgYWdlIGRpZmZlcmVuY2UgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMuIFRoZSBkZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zIG9mIHRoZSBpbnRlcmNlcHRzIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgcHJpbWFyeSBwYXJhbWV0ZXJzIG9mIGludGVyZXN0IGZvciB0aGVzZSBhbmFseXNlcy4gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgdGFibGUgaW5jbHVkZXMgdGhlIGVzdGltYXRlIChiKSBhbmQgYSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoYXQgZXN0aW1hdGUuIEFzdGVyaXNrcyBpbmRpY2F0ZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIHRoYXQgZG8gbm90IGluY2x1ZGUgMC4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhjKDEsIDI4LCA1NSksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCAyNykgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIE1JTkQiLCAyOCwgNTQpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDU1LCA4MSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24iID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQuNwpgYGAKCgojIFN0dWR5IDQ6IEEgZm9jdXMgb24gZWFybHkgY2hpbGRob29kICg0LTV5KQoKSW4gdGhlIGNvbnRleHQgb2YgdGhpcyBkaXNzZXJ0YXRpb24sIFN0dWR5IDQgc2VydmVzIHRvIHByb3ZpZGUgYSB0YXJnZXRlZCBpbnZlc3RpZ2F0aW9uIG9mIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZSBpbiB0aGUgcHJlc2Nob29sIHllYXJzICg0LTV5KS4gSW4gdGhpcyBjaGFwdGVyLCBJIGFnYWluIGZvY3VzIG9uIHdoYXQgdGhpcyBzdHVkeSBjYW4gcmV2ZWFsIGFib3V0IHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb25jZXB0dWFsIHVuaXRzIEJPRFksIEhFQVJULCBhbmQgTUlORCBhdCB0aGUgZWFybGllc3QgcG9pbnQgaW4gZGV2ZWxvcG1lbnQgdGhhdCBJIGhhdmUgYmVlbiBhYmxlIHRvIHRlc3Qgc28gZmFyLCBhbmQgY29tcGFyZSB0aGlzIGNvbmNlcHR1YWwgb3JnYW5pemF0aW9uIHRvIHRoYXQgZG9jdW1lbnRlZCBhbW9uZyBhZHVsdHMuIEFzIGEgcmVtaW5kZXIsIGluIHRoaXMgY2hhcHRlciBJIGFuYWx5emUgeW91bmcgY2hpbGRyZW4ncyByZXNwb25zZXMgd2l0aCByZXNwZWN0IHRvIHRoZSAibWF0dXJlIiBjb25jZXB0dWFsIHVuaXRzIEJPRFksIEhFQVJULCBhbmQgTUlORCwgYXMgZGVmaW5lZCBieSBFRkEgb2YgX2FkdWx0cydfIHJlc3BvbnNlcyAoc2VlIFtYWCBBUFBFTkRJWCBCP10gZm9yIGZ1cnRoZXIgYW5hbHlzZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBjb25jZXB0dWFsIHVuaXRzIGlkZW50aWZpZWQgdGhyb3VnaCBFRkEgb2YgY2hpbGRyZW4ncyBvd24gbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucywgYXMgcHJlc2VudGVkIGluIENoYXB0ZXIgSUlJKS4KCkluIFN0dWR5IDQsIGByIG5yb3coZDRfYWRfd2lkZSkvMmAgVVMgYWR1bHRzIGFuZCBgciBucm93KGQ0XzQ2X3dpZGUpLzJgIFVTIGNoaWxkcmVuIGJldHdlZW4gdGhlIGFnZXMgb2YgYHIgc3VtbWFyeShkNF80NiRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpYC1gciBzdW1tYXJ5KGQ0XzQ2JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMilgIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDRfNDYkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYHkpIGVhY2ggYXNzZXNzZWQgdHdvIHRhcmdldCBjaGFyYWN0ZXJzIG9uIDE4IG1lbnRhbCBjYXBhY2l0aWVzLiBUbyBtYWtlIHRoZSBzdHVkeSBhcHByb3ByaWF0ZSBmb3IgY2hpbGRyZW4gaW4gdGhpcyBhZ2UgcmFuZ2UsIHRoaXMgc3R1ZHkgZW1wbG95ZWQgYSBuZXcgc2V0IG9mIDE4IG1lbnRhbCBjYXBhY2l0aWVzIChzb21lIGJ1dCBub3QgYWxsIG9mIHdoaWNoIHdlcmUgdXNlZCBpbiBTdHVkaWVzIDEtMykuIEluIGFkZGl0aW9uLCBwYXJ0aWNpcGFudHMgd2VyZSBwcmVzZW50ZWQgd2l0aCBhIG1vcmUgY2hpbGQtZnJpZW5kbHkgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAzLXBvaW50IHJlc3BvbnNlIHNjYWxlICgibm8sIiBjb2RlZCBhcyAwOyAia2luZGEsIiBjb2RlZCBhcyAwLjUsICJ5ZXMsIiBjb2RlZCBhcyAxKS4gVGhpcyBzdHVkeSBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgYXNzZXNzaW5nIGJvdGggYSBiZWV0bGUgb3IgYSByb2JvdCBpbiBzZXF1ZW5jZSAod2l0aCBvcmRlciBjb3VudGVyYmFsYW5jZWQgYWNyb3NzIHBhcnRpY2lwYW50cykuIChTZWUgQ2hhcHRlciBJSSBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBSZXN1bHRzCgojIyMgQWR1bHRzCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2Q0X2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2Q0X2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2Q0X2FkKQpkNF9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQ0X2FkLCBzY2FsZXNfZWZhX3dkbV9kNF9hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2Q0X2FkIikKc2F2ZVJEUyhkNF9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDRfYWRfc2NvcmVkX2FkIikKYGBgCgpgYGB7cn0Kc2NhbGVzX3N0dWR5NCA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDRfYWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSA0OiBBZHVsdHMiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBzcHJlYWQoc3R1ZHksIGZhY3RvcikgJT4lCiAgbXV0YXRlKHVyX2ZhY3RvciA9IGBTdHVkeSA0OiBBZHVsdHNgKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDRfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfYWQgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCkgJT4lCiAgc2VsZWN0KC11cl9mYWN0b3IpICMlPiUKIyBzZWxlY3QoLXN0YXJ0c193aXRoKCJvcmRlciIpKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluIHRoZSAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kNF9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjEwLgoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KcGxvdHNfZDRfYWRfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDRfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDRfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2Q0X2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2Q0X2FkX3Bsb3RzLCBmaWdfZDRfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2Q0X2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgNDogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kNF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kNF9hZF90aXRsZSwgZmlnX2Q0X2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDRfYWRfcGxvdHNfbGVnX3RpdGxlCmBgYAoKVmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyBzY29yZXMgb24gdGhlc2UgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhcmUgcHJvdmlkZWQgaW4gRmlndXJlIDQuOCwgcm93IEEuCgpUaGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgYWxsIGV4dHJlbWVseSBzaW1pbGFyIHRvIHRob3NlIGRpc2N1c3NlZCBhdCBsZW5ndGggaW4gU3R1ZGllcyAxYS0xYyBhbmQgU3R1ZHkgMjsgSSB3aWxsIG5vdCBkZXNjcmliZSB0aGVtIGZ1cnRoZXIgaGVyZS4KCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIHRoZXNlIGFzeW1tZXRyaWVzLiBBcyBpbiBwcmV2aW91cyBzdHVkaWVzLCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLCBJIGNvbmR1Y3QgYSBCYXllc2lhbiByZWdyZXNzaW9uIHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGVzZSB0d28gY29uY2VwdHVhbCB1bml0cyB0byB6ZXJvLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHR3byAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMuIEFzIGluIFN0dWR5IDFkLCBJIGFjY291bnQgZm9yIHRoZSB3aXRoaW4tc3ViamVjdHMgZGVzaWduIGJ5IGluY2x1ZGVkIG1heGltYWwgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlIChpbiB0aGlzIGNhc2UsIHJhbmRvbSBpbnRlcmNlcHRzIGZvciBwYXJ0aWNpcGFudHMpLiBTZWUgRmlndXJlIDQuOSwgcGFuZWwgRCwgZm9yIHZpc3VhbCBkZXBpY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLgoKYGBge3J9CmQ0X2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQ0X2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQ0X2FkX3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9lZGdlCgpzYXZlUkRTKGQ0X2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDRfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2Q0X2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkNF9hZF9zY29yZWRfYWRfZGlmZikKYGBgCgpgYGB7cn0KIyByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kNF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDRfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIkFkdWx0cyIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiAgc2VsZWN0KC1zdHVkeSwgLXMuZS4pICU+JQogICMgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2Q0X2FkX3Njb3JlZF9hZF9kaWZmCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGluIHByZXZpb3VzIHN0dWRpZXMsIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyBhZHVsdHMnIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44KS4gQWdhaW4sIHRoaXMgZGlmZmVyZW5jZSB3YXMgZHJpdmVuIGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZTsgaW4gdGhlIGFnZ3JlZ2F0ZSwgZGlmZmVyZW5jZSBzY29yZXMgd2VyZSByZWR1Y2VkIHRvIDAgZm9yIHRoZSByb2JvdCAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjgpLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpBcyBwcmV2aW91cyBzdHVkaWVzLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgYWR1bHRzJyBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuIEFnYWluLCB0aGlzIGRpZmZlcmVuY2Ugd2FzIGRyaXZlbiBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdDsgaW4gdGhlIGFnZ3JlZ2F0ZSwgZGlmZmVyZW5jZSBzY29yZXMgdGVuZGVkIHRvIGJlIF9ncmVhdGVyXywgbm90IGxlc3MsIHRoYW4gemVybyBmb3IgdGhlIGJlZXRsZSAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQXMgaW4gcHJldmlvdXMgc3R1ZGllcywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIGFkdWx0cycgc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjgpLiBBZ2FpbiwgdGhpcyBkaWZmZXJlbmNlIHdhcyBzb21ld2hhdCBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QsIHJlbGF0aXZlIHRvIHRoZSBiZWV0bGUgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44KS4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgNCBjb25maXJtIG15IGluZm9ybWFsIG9ic2VydmF0aW9ucyBvZiBhc3ltbWV0cmllcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIGFuZCBhbGlnbiBxdWl0ZSBjbG9zZWx5IHdpdGggYW5hbHlzZXMgb2YgYWR1bHRzIGluIFN0dWRpZXMgMWEtMWMgYW5kIFN0dWR5IDI6IEFjcm9zcyBhbGwgb2YgdGhlIHN0dWRpZXMgdGhhdCB1c2VkIHRoZSAiZWRnZSBjYXNlIGFwcHJvYWNoIiB0byBpbmR1Y2luZyB2YXJpYWJpbGl0eSBpbiBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zLCBhZHVsdHMgdGVuZGVkIHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSBvciBIRUFSVCwgYW5kIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULgoKIyMjIENoaWxkcmVuICg0LTV5KQoKYGBge3J9CmQ0XzQ2X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDRfNDYsIHNjYWxlc19lZmFfd2RtX2Q0X2FkKQpzYXZlUkRTKGQ0XzQ2X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kNF80Nl9zY29yZWRfYWQiKQpgYGAKClhYIF9fSU5TRVJUIFNFQ1RJT04gSU5UUk9EVUNUSU9OL1RSQU5TSVRJT05fXwoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KcGxvdHNfZDRfNDZfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDRfNDZfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDRfNDZfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2Q0XzQ2X3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWdfZDRfNDZfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1sxXV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2Q0XzQ2X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2Q0XzQ2X3Bsb3RzLCBmaWdfZDRfNDZfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2Q0XzQ2X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgNDogQ2hpbGRyZW4sIDQtNXkgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2Q0XzQ2X3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2Q0XzQ2X3RpdGxlLCBmaWdfZDRfNDZfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kNF80Nl9wbG90c19sZWdfdGl0bGUKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC44LCByb3cgQi4KCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpGaXJzdCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIEhFQVJUIChGaWd1cmUgNC44LCBwYW5lbCBCMSkuIEFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChwYW5lbCBBMSksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBiZWxvdyBpdOKAlGJ1dCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlLCBsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cywgbWFueSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChwYXJ0aWN1bGFybHkgdG8gdGhlIGJlZXRsZSwgaW4gcmVkKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWSAocGFydGljdWxhcmx5IHRvIHRoZSByb2JvdCwgaW4gYmx1ZSkuIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjgsIHBhbmVsIEIyKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEEyKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIHRoZXJlIGlzIG5vIG9idmlvdXMgZXZpZGVuY2Ugb2YgYW55IGFzeW1tZXRyeSBpbiBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiB0aGVzZSB0d28gY29uY2VwdHVhbCB1bml0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlLCBsaWtlIHRoZSBtYWpvcml0eSBvZiBhZHVsdHMsIHNvbWUgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChwYXJ0aWN1bGFybHkgdG8gdGhlIHJvYm90LCBpbiBibHVlKSwgb3RoZXIgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBNSU5EIChwYXJ0aWN1bGFybHkgdG8gdGhlIGJlZXRsZSwgaW4gcmVkKS4gVGhpcyBpcyByZW1pbmlzY2VudCBvZiBteSBlYXJsaWVyIG9ic2VydmF0aW9uIGFtb25nIG9sZGVyIGNoaWxkcmVuICg3LTl5KSBpbiBTdHVkeSAyLCB3aGVyZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gX0JPRFlfIGFuZCBfTUlORF8gc2NvcmVzIHdlbnQgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyBmb3IgdGhlc2UgdHdvICJlZGdlIGNhc2VzLiIKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpGaW5hbGx5IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gSEVBUlQgYW5kIE1JTkQgKEZpZ3VyZSA0LjgsIHBhbmVsIEIzKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEEzKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyBhcHBlYXJzIHRvIGJlIHBvc2l0aXZlLCBhbmQgdGhlcmUgYXBwZWFyIHRvIGJlIHNvbWV3aGF0IGZld2VyIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGFib3ZlIGl04oCUYnV0LCBhcyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbnMsIGJvdGggb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIGFyZSBtdWNoIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiB0aGV5IHdlcmUgYW1vbmcgYWR1bHRzLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUgbWFueSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIE1JTkQuIFRoaXMgYXBwZWFycyB0byBoYXZlIGJlZW4gdHJ1ZSBmb3IgYm90aCB0YXJnZXQgY2hhcmFjdGVycy4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVXNpbmcgYSBwYXJ0aWN1bGFybHkgY2hpbGQtZnJpZW5kbHkgcGFyYWRpZ20sIHRoZSByZWxhdGlvbnNoaXBzIHlvdW5nIGNoaWxkcmVuJ3MgZW5kb3JzZW1lbnRzIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORCAoYXMgZGVmaW5lZCBieSBhZHVsdHMnIEVGQSBzb2x1dGlvbikgYXBwZWFyIHRvIGJlIHNsaWdodGx5IG1vcmUgcmVzb25hbnQgd2l0aCB0aGUgcmVsYXRpb25zaGlwcyBvYnNlcnZlZCBhbW9uZyBhZHVsdHMuIEFsbCBvZiB0aGVzZSBpbnRlci11bml0IHJlbGF0aW9uc2hpcHMgd2VyZSBzb21ld2hhdCBwb3NpdGl2ZeKAlGJ1dCBvbmx5IHNvbWV3aGF0LiBUaGVyZSB3YXMgc29tZSBldmlkZW5jZSBvZiBhc3ltbWV0cmllcyBpbiB0aGVzZSBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzLCBidXQgdGhlc2UgYXN5bW1ldHJpZXMgd2VyZSBnZW5lcmFsbHkgd2Vha2VyIGFuZCBhcHBlYXJlZCB0byBiZSBoaWdobHkgZGVwZW5kZW50IG9uIHdoaWNoIHRhcmdldCBjaGFyYWN0ZXIgcGFydGljaXBhbnRzIGFzc2Vzc2VkIChwYXJ0aWN1bGFybHkgZm9yIHRoZSBCT0RZIHZzLiBIRUFSVCBhbmQgQk9EWSB2cy4gTUlORCBjb21wYXJpc29ucywgYXMgd2FzIHRoZSBjYXNlIGluIFN0dWR5IDIgd2l0aCBvbGRlciBjaGlsZHJlbikuCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGUgYXN5bW1ldHJpZXMgKG9yIGxhY2sgdGhlcmVvZikgcmV2ZWFsZWQgYnkgdGhlIHZpc3VhbGl6YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBBcyBpbiBwcmV2aW91cyBhbmFseXNlcywgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKSwgSSBjb25kdWN0IGEgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSB0d28gImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzIChiZWV0bGUgYW5kIHJvYm90KSwgYW5kIGFjY291bnRpbmcgZm9yIHRoZSB3aXRoaW4tc3ViamVjdHMgZGVzaWduIG9mIHRoaXMgc3R1ZHkgYnkgaW5jbHVkaW5nIG1heGltYWwgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlcyAoaW4gdGhpcyBjYXNlLCByYW5kb20gaW50ZXJjZXB0cyBmb3IgcGFydGljaXBhbnRzKS4gU2VlIEZpZ3VyZSA0LjksIHBhbmVsIEIsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkNF80Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkNF80Nl9zY29yZWRfYWQpCmNvbnRyYXN0cyhkNF80Nl9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkNF80Nl9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2Q0XzQ2X3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kNF80Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDRfNDZfc2NvcmVkX2FkX2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNC01eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kNF80Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgIyBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDRfNDZfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgYW1vbmcgYWR1bHRzLCBhbW9uZyBjaGlsZHJlbiBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgd2VyZSBzaWduaWZpY2FudGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX0JPRFlfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuIEhvd2V2ZXIsIHRoaXMgYXN5bW1ldHJ5IHdhcyByZWR1Y2VkIHRvIHplcm8gZm9yIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjgpLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpJbiBjb250cmFzdCB0byBhZHVsdHMsIGFtb25nIGNoaWxkcmVuIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgbm90IGRpZmZlcmVudGlhYmxlIGZyb20gemVybyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuIFRoaXMgYXBwZWFycyB0byBiZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgYXN5bW1ldHJ5IHJhbiBpbiBkaWZmZXJlbnQgZGlyZWN0aW9ucyBmb3IgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycyAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuICAKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpBcyBhbW9uZyBhZHVsdHMsIGFtb25nIGNoaWxkcmVuIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44KSwgYW5kIHRoaXMgZGlmZmVyZW5jZSB3YXMgc2xpZ2h0bHkgZXhhZ2dlcmF0ZWQgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90IChzZWUgdGhlICJSb2JvdCB2cy4gR00iIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClRoZXNlIGZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYW1vbmcgY2hpbGRyZW4gaW4gU3R1ZHkgNCBjb25maXJtIG15IGluZm9ybWFsIG9ic2VydmF0aW9ucyB0aGF0IGluIHRoaXMgcGFydGljdWxhcmx5IGNoaWxkLWZyaWVuZGx5IHBhcmFkaWdtLCB5b3VuZyBjaGlsZHJlbiB3ZXJlIGFkdWx0LWxpa2UgaW4gdGhlaXIgdGVuZGVuY3kgdG8gZW5kb3JzZSBCT0RZIGFuZCBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVCwgd2hpbGUgZmFpbGluZyB0byBzaG93IHRoZSBhZHVsdC1saWtlIHRlbmRlbmN5IHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSBmb3IgdGhlc2UgdHdvIGVkZ2UgY2FzZXMuIEluc3RlYWQsIGxpa2UgY2hpbGRyZW4gaW4gb3RoZXIgc3R1ZGllcyAoWFggX19JTlNFUlQgUkVGRVJFTkNFU19fKSwgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgYXBwZWFyZWQgdG8gZGVwZW5kIG9uIHdoaWNoIHRhcmdldCB3YXMgYmVpbmcgYXNzZXNzZWQuCgpgYGB7cn0KcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkIDwtIHJlbHZpel9hZ2VncF9mdW4oCiAgZF9zY29yZWQgPSBkNF9hZF9zY29yZWRfYWQgJT4lIAogICAgZnVsbF9qb2luKGQ0XzQ2X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjQ2IiwgImFkdWx0cyIpLAogIGFnZV9ncm91cF9sYWJlbHMgPSBjKCJDaGlsZHJlbiAoNC01eSkiLCAiQWR1bHRzIiksCiAgY29sb3JzID0gY29sb3JzMDIpCmBgYAoKYGBge3J9CmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDMSIsICJDMiIsICJDMyIpLCBuY29sID0gMykKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBuYS50cmFuc2xhdGUgPSBGLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90cywgZmlnX2Q0X2FsbF9zY29yZWRfYWRfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlRyYWNraW5nIGRldmVsb3BtZW50IGJldHdlZW4gNC01eSBhbmQgYWR1bHRob29kIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfdGl0bGUsIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyfQpmaWd1cmU0LjggPC0gcGxvdF9ncmlkKGZpZ19kNF9hZF9wbG90c19sZWdfdGl0bGUsIAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kNF80Nl9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxKQoKZmlndXJlNC44X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuOCwgc3RyX3dyYXAoIkZpZ3VyZSA0Ljg6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJywgb2xkZXIgY2hpbGRyZW4ncywgYW5kIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSA0LCBzY29yZWQgdXNpbmcgYWR1bHRzJyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NhbGVzIChzZWUgVGFibGUgNC4xMCkuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gKEEpIEFkdWx0cy4gKEIpIENoaWxkcmVuICg0LTZ5IG9mIGFnZSksIHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcy4gKEMpIEEgdmlzdWFsaXphdGlvbiBvZiBkZXZlbG9wbWVudCBiZXR3ZWVuIDQtNnkgYW5kIGFkdWx0aG9vZCwgdXNpbmcgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFuZCBhZ2UgZ3JvdXAuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbiBwYW5lbHMgQS1CLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiBQZWFyc29uIGNvcnJlbGF0aW9ucyBhcmUgcmVwb3J0ZWQgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS40fQpnZ2RyYXcoZmlndXJlNC44X2NhcCkKYGBgCgojIyMgRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uCgpJbiB0aGUgcHJldmlvdXMgc2VjdGlvbnMsIEkgYW5hbHl6ZWQgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyByZXNwb25zZXMgc2VwYXJhdGVseS4gSGVyZSBJIGNvbmR1Y3QgYSBmb3JtYWwgY29tcGFyaXNvbiBvZiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMgYW1vbmcgdGhlc2UgdHdvIGFnZSBncm91cHMsIHRvIGFzc2VzcyB0aGUgc2l6ZSBhbmQgcm9idXN0bmVzcyBvZiB0aGVzZSBvc3RlbnNpdmUgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcy4KCmBgYHtyfQpkNF9hZDQ2X3Njb3JlZF9hZF9kaWZmIDwtIGZ1bGxfam9pbihkNF9hZF9zY29yZWRfYWRfZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDRfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwKSkKY29udHJhc3RzKGQ0X2FkNDZfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKY29udHJhc3RzKGQ0X2FkNDZfc2NvcmVkX2FkX2RpZmYkYWdlX2dyb3VwKSA8LSBjb250cmFzdHNfZHVtMl9hZ2VncApgYGAKCmBgYHtyfQojIHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24iLAogIGNoYXJfbGFiZWwgPSAiUm9ib3QgdnMuIEdNIiwgCiAgYWdlZ3BfbGFiZWwgPSAiQ2hpbGRyZW4gdnMuIGFkdWx0cyIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICAjIGZpbHRlcihwYXJhbSAlaW4lIGMoIkNoaWxkcmVuIHZzLiBhZHVsdHMiLCAiSW50ZXJhY3Rpb24iKSkgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9ncmlkKHBsb3RfZDRfYWRfc2NvcmVkX2FkX2RpZmYsIHBsb3RfZDRfNDZfc2NvcmVkX2FkX2RpZmYsIG5jb2wgPSAyKQpgYGAKCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBjbG9zZXIgdG8gemVybyBhbW9uZyBjaGlsZHJlbiwgYXMgY29tcGFyZWQgdG8gYWR1bHRzIChzZWUgdGhlICJDaGlsZHJlbiB2cy4gYWR1bHRzIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjkpLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyB3YXMgYXR0ZW51YXRlZCBhbW9uZyBjaGlsZHJlbiAoc2VlIHRoZSAiSW50ZXJhY3Rpb24iIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOSkuICAKCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY2xvc2VyIHRvIHplcm8gYW1vbmcgY2hpbGRyZW4sIGFzIGNvbXBhcmVkIHRvIGFkdWx0cyAoc2VlIHRoZSAiQ2hpbGRyZW4gdnMuIGFkdWx0cyIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjkpLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyB3YXMgYXR0ZW51YXRlZCBhbW9uZyBjaGlsZHJlbiAoc2VlIHRoZSAiSW50ZXJhY3Rpb24iIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC45KS4gIAoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IGNsb3NlciB0byB6ZXJvIGFtb25nIGNoaWxkcmVuLCBhcyBjb21wYXJlZCB0byBhZHVsdHMgKHNlZSB0aGUgIkNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOSksIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzICB3YXMgYXR0ZW51YXRlZCBhbW9uZyBjaGlsZHJlbiAoc2VlIHRoZSAiSW50ZXJhY3Rpb24iIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOSkuICAKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGNvbXBhcmlzb25zIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIGNoaWxkcmVuIHZzLiBhZHVsdHMgaW4gU3R1ZHkgNCBjb25maXJtIG15IGVhcmxpZXIgb2JzZXJ2YXRpb25zIHRoYXQgYXN5bW1ldHJpZXMgd2VyZSBzdWJzdGFudGlhbGx5IGF0dGVudWF0ZWQgKGFuZCBpbiBzb21lIGNhc2VzLCByZWR1Y2VkIHRvIHplcm8pIGFtb25nIGNoaWxkcmVuLCByZWxhdGl2ZSB0byB0aGUgYmFzZWxpbmUgc2V0IGJ5IGFkdWx0cy4gSW4gYWRkaXRpb24sIGFtb25nIGNoaWxkcmVuIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGVzZSBhc3ltbWV0cmllcyBiZXR3ZWVuIHRoZSB0d28gImVkZ2UgY2FzZXMiIGluY2x1ZGVkIGluIHRoaXMgc3R1ZHkgKHRoZSBiZWV0bGUgdnMuIHRoZSByb2JvdCkgd2VyZSBhbHNvIGF0dGVudWF0ZWQsIHJlbGF0aXZlIHRvIGFkdWx0cy4KCiMjIERpc2N1c3Npb24KClhYIF9fSU5TRVJUIFNUVURZIDQgRElTQ1VTU0lPTl9fCgpgYGB7cn0KcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkIDwtIHJlbHZpel9hZ2VncF9mdW4oCiAgZF9zY29yZWQgPSBkNF9hZF9zY29yZWRfYWQgJT4lIAogICAgZnVsbF9qb2luKGQ0XzQ2X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjQ2IiwgImFkdWx0cyIpLAogIGFnZV9ncm91cF9sYWJlbHMgPSBjKCJDaGlsZHJlbiwgKDQtNXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiZDQiKSwgbmNvbCA9IDMpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzFdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLCBuYS50cmFuc2xhdGUgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlRyYWNraW5nIGRldmVsb3BtZW50IGJldHdlZW4gNC01eSBhbmQgYWR1bHRob29kIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfdGl0bGUsIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyfQpmaWd1cmU0LjlfcGxvdHMgPC0gcGxvdF9ncmlkKAogIHBsb3RfZDRfYWRfc2NvcmVkX2FkX2RpZmYgKwogICAgbGFicyh0aXRsZSA9ICJTdHVkeSA0OiBBZHVsdHMiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksCiAgcGxvdF9kNF80Nl9zY29yZWRfYWRfZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSA0OiBDaGlsZHJlbiwgNC01eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgCiAgbmNvbCA9IDIsIHJlbF93aWR0aHMgPSBjKDEsIDEpLAogIGxhYmVscyA9ICJBVVRPIikKCmZpZ3VyZTQuOV9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjlfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgNC45OiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgNC4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEsIHN1Y2ggdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIC0xIHRvICsxLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gZGlmZmVyZW5jZSBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQgKGkuZS4sIGEgZGlmZmVyZW5jZSBzY29yZSBvZiAwKS4iLCAxODApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDAuMzh9CmdnZHJhdyhmaWd1cmU0LjlfY2FwKQpgYGAKCmBgYHtyfQpyZWd0YWJfc3R1ZHk0IDwtIHJlZ3RhYl9kNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBmdWxsX2pvaW4ocmVndGFiX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGVfYXQodmFycyhiLCBzLmUuKSwKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgZGlnaXRzID0gMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgdW5pdGUocmVzdWx0LCBiLCBzLmUuLCBDSTk1LCBub256ZXJvKSAlPiUKICBzcHJlYWQoc3R1ZHksIHJlc3VsdCkgJT4lCiAgc2VwYXJhdGUoYEFkdWx0c2AsIGMoInM0YV9iIiwgInM0YV9zLmUuIiwgInM0YV85NSUgQ0kiLCAiczRhX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYENoaWxkcmVuLCA0LTV5ICh1c2luZyBhZHVsdHMnIHNjYWxlcylgLCBjKCJzNGJfYiIsICJzNGJfcy5lLiIsICJzNGJfOTUlIENJIiwgInM0Yl9ueiIpLCBzZXAgPSAiXyIpCmBgYAoKYGBge3J9CnRhYmxlNC44IDwtIHJlZ3RhYl9zdHVkeTQgJT4lCiAgc2VsZWN0KC1wYWlyLCAtY29udGFpbnMoInMuZS4iKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigibnoiLCAiICIsIC4pKSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoInM0Ll8iLCAiIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC44OiBSZWdyZXNzaW9uIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIFVTIGFkdWx0cyBhbmQgY2hpbGRyZW4gKDQtNXkgb2YgYWdlKSBpbiBTdHVkeSA0LiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gVGhlIGludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMSwgMywgNSksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCAyKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gTUlORCIsIDMsIDQpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDUsIDYpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiQWR1bHRzIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjgKYGBgCgpgYGB7cn0KdGFibGU0LjkgPC0gcmVndGFiX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgc2VsZWN0KC1wYWlyLCAtc3R1ZHksIC1jb250YWlucygicy5lLiIpKSAlPiUKICBtdXRhdGUoYiA9IGZvcm1hdChyb3VuZChiLCAyKSwgbnNtYWxsID0gMikpICU+JQogIHJlbmFtZShQYXJhbWV0ZXIgPSBwYXJhbSwKICAgICAgICAgYDk1JSBDSWAgPSBDSTk1KSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1Yigibm9uemVybyIsICIgIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC45OiBSZWdyZXNzaW9uIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2VzIGluIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzIGFuZCBjaGlsZHJlbiAoNC01eSBvZiBhZ2UpIGRpZmZlcmVuY2Ugc2NvcmVzIGluIFN0dWR5IDQuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgZm91ciBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQgKGZvciBhZHVsdHMpLCB3aGljaCBJIHRyZWF0IGFzIGFuIGluZGV4IG9mIHRoZSBhc3ltbWV0cnkgaW4gYXR0cmlidXRpb25zIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBpbiBxdWVzdGlvbiBhbW9uZyBhZHVsdHM7ICgyKSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyAoYW1vbmcgYWR1bHRzKSwgcmVwb3J0ZWQgaGVyZSBhcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcm9ib3QgYW5kIHRoZSBncmFuZCBtZWFuIChHTSk7ICgzKSB0aGUgb3ZlcmFsbCBkaWZmZXJlbmNlIGJldHdlZW4gY2hpbGRyZW4gYW5kIGFkdWx0cyAoY29sbGFwc2luZyBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMpOyBhbmQgKDQpIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMgYWdlIGRpZmZlcmVuY2UgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMuIFRoZSBkZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgcHJpbWFyeSBwYXJhbWV0ZXJzIG9mIGludGVyZXN0IGZvciB0aGVzZSBhbmFseXNlcy4gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgdGFibGUgaW5jbHVkZXMgdGhlIGVzdGltYXRlIChiKSBhbmQgYSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoYXQgZXN0aW1hdGUuIEFzdGVyaXNrcyBpbmRpY2F0ZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIHRoYXQgZG8gbm90IGluY2x1ZGUgMC4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhzZXEoMiwgMTIsIDIpLCBib2xkID0gVCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIEhFQVJUIiwgMSwgNCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIE1JTkQiLCA1LCA4KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCA5LCAxMikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24iID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQuOQpgYGAKCmBgYHtyfQp0YWJsZTQuMTAgPC0gc2NhbGVzX3N0dWR5MiAlPiUgCiAgbXV0YXRlKGNhcGFjaXR5ID0gY2FzZV93aGVuKAogICAgZ3JlcGwoInNhZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzYWQiLAogICAgZ3JlcGwoInNjYXJlZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzY2FyZWQiLAogICAgZ3JlcGwoImhlYXIiLCBjYXBhY2l0eSkgfiAiaGVhciBbc291bmRzXSIsCiAgICBncmVwbCgic2VlIiwgY2FwYWNpdHkpIH4gInNlZSBbdGhpbmdzXSIsCiAgICBncmVwbCgiaHVuZ3J5IiwgY2FwYWNpdHkpIH4gImdldC9mZWVsIGh1bmdyeSIsCiAgICBncmVwbCgic2ljayIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBzaWNrWy4uLl0iLAogICAgZ3JlcGwoInRob3VnaHRzIiwgY2FwYWNpdHkpIHwgZ3JlcGwoInRoaW5rIiwgY2FwYWNpdHkpIH4gImhhdmUgdGhvdWdodHMvdGhpbmsiLAogICAgZ3JlcGwoImZpZ3VyZSIsIGNhcGFjaXR5KSB+ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MvZmlndXJlIHRoaW5ncyBvdXQiLAogICAgZ3JlcGwoImxvdmUiICxjYXBhY2l0eSkgfiAiZmVlbCBsb3ZlL2xvdmUgc29tZW9uZSIsCiAgICBncmVwbCgiZ3VpbHQiLCBjYXBhY2l0eSkgfCBncmVwbCgic29ycnkiLCBjYXBhY2l0eSkgfiAiZmVlbCBndWlsdHkvc29ycnkiLAogICAgVFJVRSB+IGNhcGFjaXR5KSkgJT4lCiAgcmVuYW1lKG9yZGVyX2FkX3MyID0gb3JkZXJfYWQsCiAgICAgICAgIG9yZGVyXzc5X3MyID0gb3JkZXJfNzkpICU+JQogIGZ1bGxfam9pbihzY2FsZXNfc3R1ZHkzICU+JQogICAgICAgICAgICAgIG11dGF0ZShjYXBhY2l0eSA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgIGdyZXBsKCJzYWQiLCBjYXBhY2l0eSkgfiAiZmVlbC9nZXQgc2FkIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJzY2FyZWQiLCBjYXBhY2l0eSkgfiAiZmVlbC9nZXQgc2NhcmVkIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJoZWFyIiwgY2FwYWNpdHkpIH4gImhlYXIgW3NvdW5kc10iLAogICAgICAgICAgICAgICAgZ3JlcGwoInNlZSIsIGNhcGFjaXR5KSB+ICJzZWUgW3RoaW5nc10iLAogICAgICAgICAgICAgICAgZ3JlcGwoImh1bmdyeSIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBodW5ncnkiLAogICAgICAgICAgICAgICAgZ3JlcGwoInNpY2siLCBjYXBhY2l0eSkgfiAiZ2V0L2ZlZWwgc2lja1suLi5dIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJ0aG91Z2h0cyIsIGNhcGFjaXR5KSB8IGdyZXBsKCJ0aGluayIsIGNhcGFjaXR5KSB+ICJoYXZlIHRob3VnaHRzL3RoaW5rIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJmaWd1cmUiLCBjYXBhY2l0eSkgfiAiZmlndXJlIG91dCBob3cgdG8gZG8gdGhpbmdzL2ZpZ3VyZSB0aGluZ3Mgb3V0IiwKICAgICAgICAgICAgICAgIGdyZXBsKCJsb3ZlIiwgY2FwYWNpdHkpIH4gImZlZWwgbG92ZS9sb3ZlIHNvbWVvbmUiLAogICAgICAgICAgICAgICAgZ3JlcGwoImd1aWx0IiwgY2FwYWNpdHkpIHwgZ3JlcGwoInNvcnJ5IiwgY2FwYWNpdHkpIH4gImZlZWwgZ3VpbHR5L3NvcnJ5IiwKICAgICAgICAgICAgICAgIFRSVUUgfiBjYXBhY2l0eSkpICU+JQogICAgICAgICAgICAgIHJlbmFtZShvcmRlcl9hZF9zMyA9IG9yZGVyX2FkLAogICAgICAgICAgICAgICAgICAgICBvcmRlcl83OV9zMyA9IG9yZGVyXzc5KSkgJT4lCiAgZnVsbF9qb2luKHNjYWxlc19zdHVkeTQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgZ3JlcGwoInNhZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzYWQiLAogICAgICAgICAgICAgICAgZ3JlcGwoInNjYXJlZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzY2FyZWQiLAogICAgICAgICAgICAgICAgZ3JlcGwoImhlYXIiLCBjYXBhY2l0eSkgfiAiaGVhciBbc291bmRzXSIsCiAgICAgICAgICAgICAgICBncmVwbCgic2VlIiwgY2FwYWNpdHkpIH4gInNlZSBbdGhpbmdzXSIsCiAgICAgICAgICAgICAgICBncmVwbCgiaHVuZ3J5IiwgY2FwYWNpdHkpIH4gImdldC9mZWVsIGh1bmdyeSIsCiAgICAgICAgICAgICAgICBncmVwbCgic2ljayIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBzaWNrWy4uLl0iLAogICAgICAgICAgICAgICAgZ3JlcGwoInRob3VnaHRzIiwgY2FwYWNpdHkpIHwgZ3JlcGwoInRoaW5rIiwgY2FwYWNpdHkpIH4gImhhdmUgdGhvdWdodHMvdGhpbmsiLAogICAgICAgICAgICAgICAgZ3JlcGwoImZpZ3VyZSIsIGNhcGFjaXR5KSB+ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MvZmlndXJlIHRoaW5ncyBvdXQiLAogICAgICAgICAgICAgICAgZ3JlcGwoImxvdmUiLCBjYXBhY2l0eSkgfiAiZmVlbCBsb3ZlL2xvdmUgc29tZW9uZSIsCiAgICAgICAgICAgICAgICBncmVwbCgiZ3VpbHQiLCBjYXBhY2l0eSkgfCBncmVwbCgic29ycnkiLCBjYXBhY2l0eSkgfiAiZmVlbCBndWlsdHkvc29ycnkiLAogICAgICAgICAgICAgICAgVFJVRSB+IGNhcGFjaXR5KSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKG9yZGVyX2FkX3M0ID0gb3JkZXJfYWQpKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gY2FzZV93aGVuKAogICAgIWlzLm5hKGBBZHVsdHNgKSB+IGBBZHVsdHNgLAogICAgIWlzLm5hKGBDaGlsZHJlbiwgNy05eWApIH4gYENoaWxkcmVuLCA3LTl5YCwKICAgICFpcy5uYShgU3R1ZHkgMzogQWR1bHRzYCkgfiBgU3R1ZHkgMzogQWR1bHRzYCwKICAgICFpcy5uYShgU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXlgKSB+IGBTdHVkeSAzOiBDaGlsZHJlbiwgNy05eWAsCiAgICAhaXMubmEoYFN0dWR5IDQ6IEFkdWx0c2ApIH4gYFN0dWR5IDQ6IEFkdWx0c2AsCiAgICBUUlVFIH4gTkFfaW50ZWdlcl8pKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gZmFjdG9yKHVyX2ZhY3RvciwgbGV2ZWxzID0gYygiQk9EWSIsICJIRUFSVCIsICJNSU5EIikpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXJfYWRfczIsIG9yZGVyXzc5X3MyLCBvcmRlcl9hZF9zMywgb3JkZXJfYWRfczQpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yLCAtc3RhcnRzX3dpdGgoIm9yZGVyIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1jYXBhY2l0eSksCiAgICAgICAgICAgIGZ1bnMoaWZlbHNlKGlzLm5hKC4pLCAiIiwgIuKckyIpKSkgJT4lCiAgcmVuYW1lKENhcGFjaXR5ID0gY2FwYWNpdHksCiAgICAgICAgIGBBZHVsdHNgID0gYFN0dWR5IDM6IEFkdWx0c2AsCiAgICAgICAgIGBDaGlsZHJlbiwgNy05eWAgPSBgU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXlgLAogICAgICAgICBgQWR1bHRzYCA9IGBTdHVkeSA0OiBBZHVsdHNgKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjEwOiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMgaW4gU3R1ZGllcyAyLTQgYW5kIGZvciA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWRpZXMgMiBhbmQgMy4gKFNlZSBBcHBlbmRpeCBCIGZvciBhbHRlcm5hdGl2ZSBzY2FsZXMgYmFzZWQgb24geW91bmdlciBjaGlsZHJlbidzIEVGQSByZXN1bHRzLCBmb3IgU3R1ZGllcyAzIGFuZCA0LikgQSBjaGVja21hcmsgaW5kaWNhdGVzIHRoYXQgYSBtZW50YWwgY2FwYWNpdHkgd2FzIGluY2x1ZGVkIGluIGEgc2NhbGUgZm9yIGEgcGFydGljdWxhciBzYW1wbGUuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMiIgPSAyLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgNCIgPSAxKSkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSBzY2FsZSIsIDEsIDkpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIHNjYWxlIiwgMTAsIDE5KSAlPiUKICBncm91cF9yb3dzKCJNSU5EIHNjYWxlIiwgMjAsIDMxKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjEwCmBgYAoKCiMgR2VuZXJhbCBkaXNjdXNzaW9uCgpYWCBfX0lOU0VSVCBTRUNUSU9OIElOVFJPRFVDVElPTl9fCgpgYGB7cn0KIyBkYXRhZnJhbWUgZm9yIGFubm90YXRpbmcgc3VtbWFyeSBwbG90cwpkZl9hbm5vdCA8LSBkYXRhLmZyYW1lKHBhaXIgPSBsZXZlbHMoZmFjdG9yKGQxYV9hZF9zY29yZWRfYWRfZGlmZiRwYWlyKSksCiAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gYygiQk9EWSB3aXRob3V0IEhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZIHdpdGhvdXQgTUlORCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSEVBUlQgd2l0aG91dCBNSU5EIiksCiAgICAgICAgICAgICAgICAgICAgICAgbmVnID0gYygiSEVBUlQgd2l0aG91dCBCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSU5EIHdpdGhvdXQgQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORCB3aXRob3V0IEhFQVJUIikpCmBgYAoKYGBge3J9CiMgY29tYmluZSBhbGwgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIHN0dWRpZXMKZGlmZnNjb3Jlc19hbGwgPC0gYmluZF9yb3dzKGQxYV9hZF9zY29yZWRfYWRfZGlmZiwgZDFiX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFjX2FkX3Njb3JlZF9hZF9kaWZmLCBkMWRfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMl9hZF9zY29yZWRfYWRfZGlmZiwgZDJfNzlfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM19hZF9zY29yZWRfYWRfZGlmZiwgZDNfNzlfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM180Nl9zY29yZWRfYWRfZGlmZiwgZDRfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkNF80Nl9zY29yZWRfYWRfZGlmZikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gZ3N1YigiOi4qJCIsICIiLCBzdHVkeSksCiAgICAgICAgIGFnZV9ncm91cCA9IGZhY3RvcihhZ2VfZ3JvdXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuNzkiLCAiY2hpbGRyZW40NiIpKSwKICAgICAgICAgZGVzaWduID0gY2FzZV93aGVuKAogICAgICAgICAgIHN0dWR5ICVpbiUgYygiU3R1ZHkgMWEiLCAiU3R1ZHkgMWIiLCAiU3R1ZHkgMiIpIH4gCiAgICAgICAgICAgICAiZWRnZSBjYXNlIChiZXR3ZWVuLVNzKSIsCiAgICAgICAgICAgc3R1ZHkgJWluJSBjKCJTdHVkeSAxYyIsICJTdHVkeSA0IikgfiAKICAgICAgICAgICAgICJlZGdlIGNhc2UgKHdpdGhpbi1TcykiLAogICAgICAgICAgIHN0dWR5ICVpbiUgYygiU3R1ZHkgMWQiLCAiU3R1ZHkgMyIpIH4gCiAgICAgICAgICAgICAiZGl2ZXJzZSBjaGFyYWN0ZXJzIChiZXR3ZWVuLVNzKSIpLAogICAgICAgICBkZXNpZ24gPSBmYWN0b3IoZGVzaWduLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImVkZ2UgY2FzZSAoYmV0d2Vlbi1TcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWRnZSBjYXNlICh3aXRoaW4tU3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpdmVyc2UgY2hhcmFjdGVycyAoYmV0d2Vlbi1TcykiKSkpCgojIGdldCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IHN0dWR5LCBzYW1wbGUKZGlmZnNjb3Jlc19hbGxfbWVhbnMgPC0gZGlmZnNjb3Jlc19hbGwgJT4lIAogIGdyb3VwX2J5KHN0dWR5LCBkZXNpZ24sIGFnZV9ncm91cCwgcGFpcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAiZGlmZiIpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKG5vbnplcm8gPSBpZmVsc2UoY2lfbG93ZXIgKiBjaV91cHBlciA+IDAsICIqIiwgIiIpLAogICAgICAgICBzdGFyX3BvcyA9IGlmZWxzZShtZWFuID4gMCwgY2lfdXBwZXIgKyAwLjA1LCBjaV9sb3dlciAtIDAuMDUpLAogICAgICAgICBzdGFyX3ZqdXN0ID0gaWZlbHNlKG1lYW4gPiAwLCAwLjUsIDEpKQpgYGAKCmBgYHtyfQpwbG90X2RpZmZzY29yZXNfYWxsIDwtIGdncGxvdChkaWZmc2NvcmVzX2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSAgYWdlX2dyb3VwLCB5ID0gZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3R1ZHksIGNvbG9yID0gc3R1ZHkpKSArCiAgZmFjZXRfZ3JpZCh+IHBhaXIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMDUsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwKSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZGlmZnNjb3Jlc19hbGxfbWVhbnMsCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIsCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGRlc2lnbiksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMi41LAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKwogIGdlb21fdGV4dChkYXRhID0gZGlmZnNjb3Jlc19hbGxfbWVhbnMsCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IG5vbnplcm8sIHkgPSBzdGFyX3Bvcywgdmp1c3QgPSBzdGFyX3ZqdXN0KSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZGZfYW5ub3QsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgYWVzKHggPSBOVUxMLCB5ID0gTlVMTCwgZ3JvdXAgPSBOVUxMLCBjb2xvciA9IE5VTEwsIHNoYXBlID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcG9zKSwgeCA9IDIsIHkgPSAxLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAxLCBzaXplID0gMykgKwogIGdlb21fdGV4dChkYXRhID0gZGZfYW5ub3QsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgYWVzKHggPSBOVUxMLCB5ID0gTlVMTCwgZ3JvdXAgPSBOVUxMLCBjb2xvciA9IE5VTEwsIHNoYXBlID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gbmVnKSwgeCA9IDIsIHkgPSAtMSwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIoIlN0dWR5IiwgcGFsZXR0ZSA9ICJEYXJrMiIsIGRpcmVjdGlvbiA9IC0xLAogICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChwb3NpdGlvbiA9ICJob3Jpem9udGFsIiwgbmNvbCA9IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwoIlZhcmlhbnQgb2YgZXhwZXJpbWVudGFsIGFwcHJvYWNoIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygxNiwgMTUsIDE3KSwKICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgbmNvbCA9IDMpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiQWdlIGdyb3VwIiwgYnJlYWtzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuNzkiLCAiY2hpbGRyZW40NiIpLAogICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQWR1bHRzIiwgIkNoaWxkcmVuLCA3LTl5IiwgIkNoaWxkcmVuLCA0LTZ5IikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIkRpZmZlcmVuY2Ugc2NvcmUiLCBicmVha3MgPSBzZXEoLTEsIDEsIDAuMikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmJveCA9ICJ2ZXJ0aWNhbCIsCiAgICAgICAgbGVnZW5kLnNwYWNpbmcgPSB1bml0KDAsICJsaW5lcyIpKQpgYGAKCmBgYHtyfQojIGNvbWJpbmUgYWxsIGFkdWx0IHJlZ3Jlc3Npb25zCnJlZ3RhYnNfYWxsX2FkIDwtIGJpbmRfcm93cyhyZWd0YWJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2QxYl9hZF9zY29yZWRfYWRfZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3RhYl9kMWNfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd0YWJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2Q0X2FkX3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgNCIpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gIkFkdWx0cyIpCgojIGNvbWJpbmUgYWxsIG9sZGVyIGNoaWxkcmVuIHJlZ3Jlc3Npb25zCnJlZ3RhYnNfYWxsXzc5IDwtIGJpbmRfcm93cyhyZWd0YWJfZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzIikpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiQ2hpbGRyZW4sIDctOXkiKQoKIyBjb21iaW5lIGFsbCB5b3VuZ2VyIGNoaWxkcmVuIHJlZ3Jlc3Npb25zCnJlZ3RhYnNfYWxsXzQ2IDwtIGJpbmRfcm93cyhyZWd0YWJfZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd0YWJfZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSA0IikpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiQ2hpbGRyZW4sIDQtNnkiKQoKIyBjb21iaW5lIGFsbCByZWdyZXNzaW9ucyBmb3IgYWxsIHN0dWRpZXMsIHNhbXBsZXMKcmVndGFic19hbGwgPC0gYmluZF9yb3dzKHJlZ3RhYnNfYWxsX2FkLCByZWd0YWJzX2FsbF83OSwgcmVndGFic19hbGxfNDYpICU+JQogIG11dGF0ZShDSTk1ID0gZ3N1YigiXFxbIiwgIiIsIENJOTUpLCAKICAgICAgICAgQ0k5NSA9IGdzdWIoIlxcXSIsICIiLCBDSTk1KSkgJT4lCiAgc2VwYXJhdGUoQ0k5NSwgYygiY2lfbG93ZXIiLCAiY2lfdXBwZXIiKSwgCiAgICAgICAgICAgc2VwID0gIiwgIiwgcmVtb3ZlID0gRiwgY29udmVydCA9IFQpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFkdWx0cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbGRyZW4sIDctOXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA0LTZ5IikpLAogICAgICAgICBkZXNpZ24gPSBjYXNlX3doZW4oCiAgICAgICAgICAgc3R1ZHkgJWluJSBjKCJTdHVkeSAxYSIsICJTdHVkeSAxYiIsICJTdHVkeSAyIikgfiAKICAgICAgICAgICAgICJlZGdlIGNhc2UgKGJldHdlZW4tU3MpIiwKICAgICAgICAgICBzdHVkeSAlaW4lIGMoIlN0dWR5IDFjIiwgIlN0dWR5IDQiKSB+IAogICAgICAgICAgICAgImVkZ2UgY2FzZSAod2l0aGluLVNzKSIsCiAgICAgICAgICAgc3R1ZHkgJWluJSBjKCJTdHVkeSAxZCIsICJTdHVkeSAzIikgfiAKICAgICAgICAgICAgICJkaXZlcnNlIGNoYXJhY3RlcnMgKGJldHdlZW4tU3MpIiksCiAgICAgICAgIGRlc2lnbiA9IGZhY3RvcihkZXNpZ24sIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZWRnZSBjYXNlIChiZXR3ZWVuLVNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlZGdlIGNhc2UgKHdpdGhpbi1TcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGl2ZXJzZSBjaGFyYWN0ZXJzIChiZXR3ZWVuLVNzKSIpKSkKYGBgCgpgYGB7cn0KcGxvdF9yZWd0YWJzX2FsbCA8LSBnZ3Bsb3QocmVndGFic19hbGwgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3Rhcl9wb3MgPSBpZmVsc2UoYiA+IDAsIGNpX3VwcGVyICsgMC4wNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lfbG93ZXIgLSAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rhcl92anVzdCA9IGlmZWxzZShiID4gMCwgMC41LCAxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYWdlX2dyb3VwLCB5ID0gYiwgZ3JvdXAgPSBzdHVkeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3R1ZHksIHNoYXBlID0gZGVzaWduKSkgKwogIGZhY2V0X2dyaWQofiBwYWlyKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHdpZHRoID0gMCkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHNpemUgPSAyKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5vbnplcm8sIHkgPSBzdGFyX3Bvcywgdmp1c3QgPSBzdGFyX3ZqdXN0KSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZGZfYW5ub3QsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgYWVzKHggPSBOVUxMLCB5ID0gTlVMTCwgZ3JvdXAgPSBOVUxMLCBjb2xvciA9IE5VTEwsIHNoYXBlID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcG9zKSwgeCA9IDIsIHkgPSAwLjQsIGhqdXN0ID0gMC41LCB2anVzdCA9IDEsIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkZl9hbm5vdCwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICBhZXMoeCA9IE5VTEwsIHkgPSBOVUxMLCBncm91cCA9IE5VTEwsIGNvbG9yID0gTlVMTCwgc2hhcGUgPSBOVUxMLAogICAgICAgICAgICAgICAgbGFiZWwgPSBuZWcpLCB4ID0gMiwgeSA9IC0wLjcsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAsIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKCJTdHVkeSIsIHBhbGV0dGUgPSAiRGFyazIiLCBkaXJlY3Rpb24gPSAtMSwKICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQocG9zaXRpb24gPSAiaG9yaXpvbnRhbCIsIG5jb2wgPSA3KSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgiVmFyaWFudCBvZiBleHBlcmltZW50YWwgYXBwcm9hY2giLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDE2LCAxNSwgMTcpLAogICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBuY29sID0gMykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIlBhcmFtZXRlciBlc3RpbWF0ZSAoYikiLCAKICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKC0wLjc0LCAwLjc0KSwgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgtMSwgMSwgMC4yKSkgKwogIGxhYnMoeCA9ICJBZ2UgZ3JvdXAiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLAogICAgICAgIGxlZ2VuZC5zcGFjaW5nID0gdW5pdCgwLCAibGluZXMiKSkKYGBgCgpgYGB7cn0KZmlndXJlNC4xMCA8LSBwbG90X2dyaWQocGxvdF9kaWZmc2NvcmVzX2FsbCArIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksIAogICAgICAgICAgICAgICAgICAgICAgICBwbG90X3JlZ3RhYnNfYWxsICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZChwbG90X3JlZ3RhYnNfYWxsKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxLCAwLjIpLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiIikpCmBgYAoKYGBge3J9CmZpZ3VyZTQuMTBfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC4xMCwgc3RyX3dyYXAoIkZpZ3VyZSA0LjEwOiBTdW1tYXJpZXMgb2YgdGhlIGFzeW1tZXRyaWVzIGluIHBhcnRpY2lwYW50cycgYXR0cmlidXRpb25zIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORCBmb3IgYWxsIHN0dWRpZXMuIChBKSBEaWZmZXJlbmNlIHNjb3JlcyBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGlnbm9yaW5nIHRhcmdldCBjaGFyYWN0ZXJzKS4gUG9zaXRpdmUgZGlmZmVyZW5jZSBzY29yZXMgY29ycmVzcG9uZCB0byBwYXJ0aWNpcGFudHMgd2hvIGF0dHJpYnV0ZWQgdGhlIGZpcnN0IGNvbmNlcHR1YWwgdW5pdCBtb3JlIHN0cm9uZ2x5IHRoYW4gdGhlIHNlY29uZDsgbmVnYXRpdmUgZGlmZmVyZW5jZSBzY29yZXMgY29ycmVzcG9uZCB0byBwYXJ0aWNpcGFudHMgd2hvIGF0dHJpYnV0ZWQgdGhlIHNlY29uZCBjb25jZXB0dWFsIHVuaXQgbW9yZSBzdHJvbmdseSB0aGFuIHRoZSBmaXJzdC4gKEIpIEludGVyY2VwdHMgZnJvbSBpbmRlcGVuZGVudCBCYXllc2lhbiByZWdyZXNzaW9uIGFuYWx5c2VzIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyBhbmQgZWFjaCBzYW1wbGUgb2YgcGFydGljaXBhbnRzLCBhY2NvdW50aW5nIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGFuZCBpbmNsdWRpbmcgcmFuZG9tIGludGVyY2VwdHMgZm9yIHBhcnRpY3BpcGFudHMgd2hlbiBhcHByb3ByaWF0ZSAoU3R1ZGllcyAxZCBhbmQgMikuIFBvc2l0aXZlIGludGVyY2VwdHMgaW5kaWNhdGUgc2FtcGxlcyBpbiB3aGljaCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGF0dHJpYnV0ZSB0aGUgZmlyc3QgY29uY2VwdHVhbCB1bml0IG1vcmUgc3Ryb25nbHkgdGhhbiB0aGUgc2Vjb25kOyBuZWdhdGl2ZSBpbnRlcmNlcHRzIGluZGljYXRlIHNhbXBsZXMgaW4gd2hpY2ggcGFydGljaXBhbnRzIHRlbmRlZCB0byBhdHRyaWJ1dGUgdGhlIHNlY29uZCBjb25jZXB0dWFsIHVuaXQgbW9yZSBzdHJvbmdseSB0aGFuIHRoZSBmaXJzdC4gRm9yIGJvdGggcGFuZWxzLCBlcnJvciBiYXJzIGFyZSA5NSUgQ0lzIGFuZCBhc3Rlcmlza3MgaW5kaWNhdGUgQ0lzIHRoYXQgZG8gbm90IGluY2x1ZGUgemVyby4iLCAxMTUpLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9CmdnZHJhdyhmaWd1cmU0LjEwX2NhcCkKYGBgCgpYWCBfX0lOU0VSVCBESVNDVVNTSU9OX18KCm91dGxpbmU6IAoKLSBhZHVsdHM6CiAgICAtIEJPRFkgYW5kIChlc3BlY2lhbGx5KSBNSU5EIG1vcmUgYmFzaWMgdGhhbiBIRUFSVAogICAgLSBNSU5EIHBlcmhhcHMgbW9yZSBiYXNpYyB0aGFuIEJPRFksIGJ1dCBtb3JlIGNvbnRpbmdlbnQgb24gY2hhcmFjdGVyczogc3Ryb25nZXN0IGZvciBiZXR3ZWVuLVNzIGNvbXBhcmlzb25zIG9mIGVkZ2UgY2FzZXMgKFN0dWRpZXMgMWEtMWMgYW5kIFN0dWR5IDIpLCB3ZWFrZXIgaW4gd2l0aGluLVNzIHZlcnNpb24gKFN0dWR5IDQpLCB3ZWFrZXN0IGZvciBkaXZlcnNlIGNoYXJhY3RlcnMgKFN0dWRpZXMgMWQgYW5kIFN0dWR5IDMpCiAgICAtIFsidGhyZXNob2xkIiBtb2RlbD9dCi0gb2xkZXIgY2hpbGRyZW46CiAgICAtIGxpa2UgYWR1bHRzLCBNSU5EIG1vcmUgYmFzaWMgdGhhbiBIRUFSVAogICAgLSBCT0RZIHBlcmhhcHMgbW9yZSBiYXNpYyB0aGFuIEhFQVJUIChsaWtlIGFkdWx0cyksIGJ1dCBvbmx5IGluIGRpdmVyc2UgY2hhcmFjdGVycyBhcHByb2FjaCAoU3R1ZHkgMyksIG5vdCBlZGdlIGNhc2VzIChTdHVkeSAyKSAtIHBlcmhhcHMgYmVjYXVzZSBvZiBkZXZlbG9wbWVudGFsIGRpZmZzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdD8gKHJldmlzaXQgaW4gY2gwNSkKICAgIC0gbGlrZSBhZHVsdHMsIE1JTkQgcGVyaGFwcyBtb3JlIGJhc2ljIHRoYW4gQk9EWSwgYnV0IG9ubHkgaW4gZWRnZSBjYXNlIGFwcHJvYWNoIChTdHVkeSAyKSwgbm90IGRpdmVyc2UgY2hhcmFjdGVycyAoU3R1ZHkgMykKICAgIC0gZ2VuZXJhbGx5LCBhbGwgYXN5bW1ldHJpZXMgd2Vha2VyCiAgICAtIFtubyBldmlkZW5jZSBvZiAidGhyZXNob2xkIiBtb2RlbF0KLSB5b3VuZ2VyIGNoaWxkcmVuOgogICAgLSBsaWtlIGFkdWx0cywgQk9EWSBtb3JlIGJhc2ljIHRoYW4gSEVBUlQgKG1vcmUgImFkdWx0LWxpa2UiIHRoYW4gb2xkZXIgY2hpbGRyZW4gYXJlISkKICAgIC0gTUlORCBwZXJoYXBzIG1vcmUgYmFzaWMgdGhhbiBIRUFSVCAobGlrZSBhZHVsdHMvb2xkZXIgY2hpbGRyZW4pLCBidXQgb25seSBpbiBlZGdlIGNhc2UgYXBwcm9hY2ggKFN0dWR5IDQpLCBub3QgZGl2ZXJzZSBjaGFyYWN0ZXJzIChTdHVkeSAzKSAtIHdoeT8gcGVyaGFwcyBiZWNhdXNlIG9mIHJvYm90PwogICAgLSBfdW5saWtlXyBhZHVsdHMvb2xkZXIgY2hpbGRyZW4sIEJPRFkgcGVyaGFwcyBtb3JlIGJhc2ljIHRoYW4gTUlORCwgYnV0IG9ubHkgaW4gZGl2ZXJzZSBjaGFyYWN0ZXJzIGFwcHJvYWNoIChTdHVkeSAzKSwgbm90IGVkZ2UgY2FzZXMgKFN0dWR5IDQpIC0gd2h5PwogICAgLSBnZW5lcmFsbHksIGFsbCBhc3ltbWV0cmllcyB3ZWFrZXIsIGV2ZW4gY29tcGFyZWQgdG8gb2xkZXIgY2hpbGRyZW4KICAgIC0gW25vIGV2aWRlbmNlIG9mICJ0aHJlc2hvbGQiIG1vZGVsXQoKWFggX19JTlNFUlQgRElTQ1VTU0lPTiBPRiBJTVBMSUNBVElPTlNfXwoKCiMgQ2hhcHRlciBjb25jbHVzaW9uCgpJbiB0aGlzIGNoYXB0ZXIsIEkgZXhwbG9yZWQgYSBzZWNvbmQgYXNwZWN0IG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlIGFtb25nIFVTIGNoaWxkcmVuIGFuZCBhZHVsdHM6IFRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMuIFN0dWRpZXMgMi00IGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGZvbGxvd2luZyB0aGVvcnk6IFhYLiAKCkFzIGluIENoYXB0ZXIgSUlJLCBJIHVyZ2UgdGhlIHJlYWRlciB0byByZW1lbWJlciB0aGF0IHRoaXMgaXMgbm90IHRoZSBvbmx5IHBvc3NpYmxlIGludGVycHJldGF0aW9uIG9mIHRoZSBwYXR0ZXJuIG9mIHJlc3VsdHMgcHJlc2VudGVkIGhlcmU7IGFkZGl0aW9uYWwgc3R1ZGllc+KAlGluIHBhcnRpY3VsYXIsIHN0dWRpZXMgZGVzaWduZWQgdG8gdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IFhY4oCUIGNvdWxkIHByb3ZpZGUgY29udmVyZ2luZyBldmlkZW5jZSBvciBjb3VsZCBjaGFsbGVuZ2UgdGhpcyB0aGVvcmV0aWNhbCBpbnRlcnByZXRhdGlvbi4gSW5zdGVhZCwgdGhlIHByaW1hcnkgcm9sZSBvZiB0aGUgcmUtYW5hbHlzaXMgZGlzY3Vzc2VkIGhlcmUgaGFzIGJlZW4gdG8gaW5zcGlyZSB0aGUgaHlwb3RoZXNpcyBzdGF0ZWQgaW4gdGhlIHByZXZpb3VzIHBhcmFncmFwaCBhbmQgdG8gdGhlIGZvdW5kYXRpb24gZm9yIGZ1dHVyZSB0ZXN0cyBvZiB0aGlzIGh5cG90aGVzaXMsIGluIHR1cm4gcmVmaW5pbmcgYSBnZW5lcmFsIHRoZW9yeSBvZiB0aGlzIGFzcGVjdCBvZiBjb25jZXB0dWFsIGRldmVsb3BtZW50LiAgCgpJbiB0aGUgbmV4dCBjaGFwdGVyLCBJIGFwcGx5IHRoZSBzYW1lIGV4cGxvcmF0b3J5IHNwaXJpdCB0byB0aGUgdGhpcmQgYW5kIGZpbmFsIGFzcGVjdCBvZiBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZTogdGhlIGFwcGxpY2F0aW9uIG9yIGRlcGxveW1lbnQgb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cyBpbiByZWFzb25pbmcgYWJvdXQgdmFyaW91cyBraW5kcyBvZiBiZWluZ3MuCgoK